ruby - 从 config.ru 设置 Sinatra 应用设置

标签 ruby sinatra rack

当我使用 Sinatra 作为 Rack 中间件时,我可以在我的 Rackup 文件中这样做:

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

当我需要中间件末尾的 run block 时,我该如何完成相同的操作 链?有点像

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

最佳答案

这是由创建 block 时 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

block 被传递给 run 方法,而不是像您预期的那样传递给应用程序的构造函数。

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

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

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

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

在这种情况下, block 与调用 MyGloriousApp.new 而不是 run 相关联。

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

关于ruby - 从 config.ru 设置 Sinatra 应用设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21229508/

相关文章:

ruby - 在 Ruby 中,是否有更好的方法根据传入的同名字符串选择常量(或完全避免常量)?

ruby-on-rails - 生成和发布基于 Ruby 的 REST API 文档

ruby - 西纳特拉、美洲狮、ActiveRecord : No connection pool with 'primary' found

sinatra - 如何在 Sinatra 中排除要求基本身份验证的路径

ruby-on-rails - 如何创建 Rails 使用的 Rack 应用程序?

sql - 查找具有多个 ActiveRecord HABTM 关联的记录

ruby-on-rails - 如何在 Rails 中使用 acts_as_taggable_on 声明标签别名?

android - Sinatra + omniauth + Android,寻求建议

ruby-on-rails - 使用 Rack Cache 时如何跟踪 API 请求数

ruby - 使用 Rack::Timeout 时的 NewRelic 报告