为什么Rails生成一个运行类而不是对象的config.ru?

awe*_*ndt 11 ruby rack ruby-on-rails

机架指定

Rack应用程序是响应调用的Ruby对象(不是类).

因此,一个简单的config.ru看起来像这样:

class MyApp
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello from Rack!\n"]]
  end
end

run MyApp.new
Run Code Online (Sandbox Code Playgroud)

而Rails生成这个:

# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
run RailsApp::Application
Run Code Online (Sandbox Code Playgroud)

所以,我想知道:为什么不在run RailsApp::Application.newRack指定它是一个对象而不是一个类?Rails::Application我缺少什么特别的东西?

Hol*_*ust 17

这确实有点隐藏:)

RailsApp::Application是一个儿童类Rails::Application,反过来Rails::Engine是一个Rails::Railtie.现在Rails::Railtie有一个inherited钩子,只要子类继承自Railtie类(在本例中Engine),就会调用它.

此回调包括Rails::Railtie::Configurable将子模块放入子类中.在本单元中,您将找到魔法的第一部分.

method_missing它获取的类中定义的方法调用方法的类的一个实例,这或多或少解析为

RailsApp::Application.new.call(...)
Run Code Online (Sandbox Code Playgroud)

call实例方法定义在Rails::Application#call典型的Rack处理中.

可能还有更多的魔法使它不是100%相当,但应该大致是......