从config.ru设置Sinatra应用程序设置

时间:2014-01-20 08:44:47

标签: ruby sinatra rack

当我使用Sinatra作为Rack中间件时,我可以在我的Rackup文件中执行此操作:

use MyGloriousApp.new do | le_app |
  le_app.settings.set :frobnicate, true
end

当我需要在中间件末尾使用run块时,如何完成相同的操作 链?像

这样的东西
run MyGloriousApp.new do | le_app |
  le_app.settings.set :frobnicate, true
end

2 个答案:

答案 0 :(得分:4)

这是由创建块时do ...end语法的优先级引起的。你的例子:

run MyGloriousApp.new do | le_app |
  le_app.settings.set :frobnicate, true
end

相当于:

run(MyGloriousApp.new) do | le_app |
  le_app.settings.set :frobnicate, true
end

该块将传递给run方法,而不是您想要的应用程序构造函数。

解决此问题的一种方法(也说明了正在发生的事情)是使用括号将块与构造函数显式关联:

run(MyGloriousApp.new do | le_app |
  le_app.settings.set :frobnicate, true
end)

{...}语法的优先级高于do...end,并绑定到其左侧最近的方法调用,因此您也可以这样做:

run MyGloriousApp.new { | le_app |
  le_app.settings.set :frobnicate, true
}

在这种情况下,该块与调用MyGloriousApp.new而非run相关联。

do...end语法与use方法一起使用的原因是use passes the block through to the middleware’s constructorrun doesn’t do anything with any block passed,所以它被忽略了。

答案 1 :(得分:2)

就像这样写:

app = LeApp.new
app.settings.set :frobnicate, true
run app