ruby-on-rails - 为什么大多数 Ruby/Rack 应用程序以这种方式引导?

标签 ruby-on-rails ruby rack

我正在尝试找到一个书面解释来解释为什么许多 Ruby 应用程序都遵循 Rack 的这种模式:

config.ru -> loads 'environment'
'environment' -> loads 'application'
'application' -> loads 'boot'

这在 Rails 应用程序中很常见,但我在非 Rails 事物(例如 Grape API 应用程序等)中看到了相同的模式,但我不明白为什么它会按这个顺序发生。为什么环境加载应用程序而不是相反?不将应用程序+启动合并到单个文件中有什么优点?是否有关于每个“桶”中应放入哪些内容的建议/规则?

Rails 文档将所有这些文件作为 Rails 启动的一部分进行讨论,但它完全忽略了此结构提供的背后的基本原理。

最佳答案

最可能的解释是历史/传统以及 Rack 本身的工作原理。 Rack 是非常小的接口(interface)。

To use Rack, provide an "app": an object that responds to the call method, taking the environment hash as a parameter, and returning an Array with three elements:

  • The HTTP response code
  • A Hash of headers
  • The response body, which must respond to #each

最简单的 Rack 应用程序就是:

run Proc.new { |env| ['200', {'Content-Type' => 'text/html'}, ['Hello World']] }

让我们看看这三个文件实际上做了什么:

  • config/environment.rb 实际上负责启动 Rails 应用程序并为 Rack 提供它可以实际运行的东西。在简单的 Rack 应用程序中,您通常可以在此处进行大量配置并处理不同的环境。但 Rails 不再是这种情况,因为它是在框架的上游处理的。
  • config/application.rb 通过需要railties 将rails 的不同部分连接在一起。它也是应用程序作者可以添加通用配置的地方。传统是,这声明了由rack运行的实际应用程序对象,而environment.rb则更加程序化。如果您从头开始构建 Rack 应用/框架,这将是您需要 /lib 文件的地方。
  • config/boot.rb 使用 Bundler 加载非 Rails 依赖项 (gems)。这种情况发生得很早,以便 Rails 本身可以使用像 Nokogiri 这样的依赖项。

可以将其合并到一个文件中吗?是的。但让每个文件执行一项任务效果很好。实际上,每个文件在某个时间点确实还包含更多的代码。例如,在 Bundler 出现之前加载依赖项真是一团糟。

关于ruby-on-rails - 为什么大多数 Ruby/Rack 应用程序以这种方式引导?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44054963/

相关文章:

ruby-on-rails - 在 Rails 4 中渲染 Pagedown Markdown

javascript - 如何使用带有 websocket-rails gem 的 channel.trigger 发送 channel 消息

ruby - 导轨错误 : "Could not find gem ' activerecord-mysql2-adapter (>= 0) ruby' in the gems available on this machine

arrays - 使用二分搜索找到具有最大和模 x 的子数组,我的解决方案使用迭代搜索。

ruby-on-rails - 您已经激活了rack 1.6.0,但是您的Gemfile 需要rack 1.6.4。在您的命令中添加 `bundle exec` 可能会解决这个问题。 ( gem ::加载错误)

ruby-on-rails - 如何使用 Rack 中间件为特定 URL 返回 404

ruby-on-rails - Rails 3 请求调度周期

ruby-on-rails - 如何对 mongodb/mongoid 脚本进行基准测试,以比较两种不同的查询技术

javascript - 嵌套 Backbone 模型未获取数据

Ruby:检查二维数组中所有值在特定列或行中是否相同的简单方法是什么?