我已经使用 Apache 和Passenger 在Ubuntu 服务器上部署了一个Sinatra 应用程序。通过一些试验和错误,我意识到该应用程序仅在禁用乘客模块时才有效。
$ a2dismod passenger
Run Code Online (Sandbox Code Playgroud)
Apache 重新启动后,应用程序按预期运行。
如果我重新启用模块...
$ a2enmod passenger
Run Code Online (Sandbox Code Playgroud)
...我在 Apache 重新启动时看到此警告:
[warn] module passenger_module is already loaded, skipping
Run Code Online (Sandbox Code Playgroud)
并且应用程序停止工作。Apache 做出响应,提供 vhost 文档根目录的内容,但没有被Passenger 识别。
我很高兴我的应用程序可以工作,但我不确定如何解释启用/禁用乘客模块的相反效果。
有人可以评论转移到Sinatra的每个过程的改进吗?
我发现我的Web API每个Passenger Rails 3进程使用大约100MB.我想知道如果我换到Sinatra会有什么改进.
使用ruby + webrick + sinatra时,'开发模式'的概念来自哪里?
require 'sinatra'
require 'sinatra/reloader'
get '/test' do
development?.to_s
end
Run Code Online (Sandbox Code Playgroud)
当我通过'ruby test.rb -p 3000'运行上述应用时,http:// localhost:3000/test返回"true"...但为什么它会返回true?开发模式是ruby,webrick,rack还是sinatra概念?此外,此功能是否记录在任何地方,特别是以非特定于轨道的方式?我发现很多人都参考了开发模式的概念,但我一直惊讶于找到相关信息的难度......也许我只是没有谷歌正确的关键词......
这是我的 sinatra 代码:
get '/' do
foo = 'not bar'
erb :index
end
Run Code Online (Sandbox Code Playgroud)
我的 layout.erb
<html>
<head></head>
<body>
<%= yield %>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我的 index.erb
<div class="container">
</div>
Run Code Online (Sandbox Code Playgroud)
现在的问题是

额外的文字(用黄色突出显示)干扰了我的设计 知道为什么会这样吗?如果我不使用布局并且仅将 index.erb 与所有 html 代码一起使用,则不会发生这种情况
[编辑:] 使用 <%= yield -%> 在 ....
我在Sinatra中创建了一个小聊天应用程序,在heroku上创建了jQuery.它只是在用户提交时将消息插入数据库.并且还每2秒下载一次新消息.经过几分钟的测试后,它停止工作,我收到了一封heroku的电子邮件:
嗨,
我们注意到gisekchat应用程序有大量连接打开共享数据库.由于性能原因,我们必须限制共享数据库的连接数.您是否可以减少共享数据库的总连接数或移动到专用数据库?
您似乎没有利用连接池,并且正在为应用程序中的每个请求打开与数据库的新连接.
谢谢,-Chris
这是支持提交消息的动作(接收非常相似):
post '/send' do
con = con = PGconn.connect($dbhost, 5432, "","",$dbname, $dbuser, $dbpass)
con.exec("insert into messages(usr, msg, date) values('#{params[:usr]}','#{params[:msg]}', now())")
end
Run Code Online (Sandbox Code Playgroud)
我该如何更改它以启用连接池?
有些Web浏览器无法发出PUT或DELETE请求,但我需要使用Sinatra将这些请求转换为使用Ruby编写的REST服务.是否有可能使Sinatra将POST请求解释为PUT或DELETE请求?
我有一个数据库,其中包含需要操作的行的列表。看起来像这样:
id remaining delivered locked
============================================
1 10 24 f
2 6 0 f
3 0 14 f
Run Code Online (Sandbox Code Playgroud)
我将DataMapper与Ruby结合使用,但实际上我认为这是一个通用的编程问题,并不特定于我正在使用的确切实现...
我正在创建一堆工作线程,它们执行以下操作(伪红代码):
while true do
t = any_row_in_database_where_remaining_greater_than_zero_and_unlocked
t.lock # update database to set locked = true
t.do_some_stuff
t.delivered += 1
t.remaining -= 1
t.unlock
end
Run Code Online (Sandbox Code Playgroud)
当然,问题是,这些线程相互竞争,并且整个线程并不是真正安全的。while循环中的第一行可以轻松地在多个线程中拉出同一行,然后才有机会被锁定。
我需要确保一个线程只能同时在一行上工作。
做这个的最好方式是什么?
我有一个简单的Sinatra应用程序,我想在所有会话和请求中共享变量.
configure do
@@click_count = 0
end
def send_message(text)
# ignore, this part works
end
post '/click' do
@@click_count = @@click_count + 1
send_message "clicks: #{@@click_count}"
end
Run Code Online (Sandbox Code Playgroud)
发送的消息始终clicks: 1不是递增.我也试过set :click_count, 0,settings.click_count = settings.click_count + 1但我仍然得到同样的东西.
我用猎枪使用本地运行的服务器shotgun web.rb -p 4567 -E production,因为在非生产提到的另一个问题环境中,服务器是失去状态的每个请求重新启动.
任何想法如何让这个工作?
我正在尝试为我使用 Sinatra 构建的 REST API 构建单元测试。现在我只想测试我的回声功能是否正常工作。Echo 使用 POST 并将从帖子中返回完全相同的有效负载。我对 ruby 还是个新手,所以如果我不使用正确的术语,请原谅我。
这是我要测试的代码:
post '/echo' do
request.body.read
end
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试进行的单元测试:
ENV['RACK_ENV'] = 'test'
require './rest_server'
require 'test/unit'
require 'rack/test'
require 'json'
class RestServer < Test::Unit::TestCase
def app
Sinatra::Application
end
def test_check_methods
data = '{"dataIn": "hello"}'
response = post '/echo', JSON.parse(data)
assert.last_response.ok?
assert(response.body == data)
end
end
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,这里是错误:
NoMethodError: undefined method `dataIn' for Sinatra::Application:Class
/Users/barrywilliams/.rvm/gems/ruby-1.9.3-p448/gems/sinatra-1.3.4/lib/sinatra/base.rb:1285:in `block in compile!'
/Users/barrywilliams/.rvm/gems/ruby-1.9.3-p448/gems/sinatra-1.3.4/lib/sinatra/base.rb:1285:in `each_pair'
/Users/barrywilliams/.rvm/gems/ruby-1.9.3-p448/gems/sinatra-1.3.4/lib/sinatra/base.rb:1285:in `compile!'
/Users/barrywilliams/.rvm/gems/ruby-1.9.3-p448/gems/sinatra-1.3.4/lib/sinatra/base.rb:1267:in `route'
/Users/barrywilliams/.rvm/gems/ruby-1.9.3-p448/gems/sinatra-1.3.4/lib/sinatra/base.rb:1256:in `post'
/Users/barrywilliams/.rvm/gems/ruby-1.9.3-p448/gems/sinatra-1.3.4/lib/sinatra/base.rb:1688:in `block (2 levels) in delegate'
/Users/barrywilliams/RubymineProjects/project/rest_server_test.rb:20:in …Run Code Online (Sandbox Code Playgroud) 这个文件config.ru是什么,在Sinatra项目中有什么用?在我的项目挂绳中,编写了这样的代码:
require './app'
run Sinatra::Application
Run Code Online (Sandbox Code Playgroud)