私の知る限り
MyApp::Application < Rails::Application
と
Rails::Application < Engine
def config #:nodoc:
@config ||= Application::Configuration.new(find_root_with_flag("config.ru", Dir.pwd))
end
end
config メソッドは Application クラスのインスタンス メソッドですが、なぜ使用できますか
My::Application < Rails::Application
config.encoding = "utf-8"
#...
end
config メソッドは My::Application のインスタンス メソッドではないでしょうか。そして、railscast Rails Initialization Walkthroughを見たことがあります。
module Rails
class Railtie
module Configurable
extend ActiveSupport::Concern
module ClassMethods
def method_missing(*args, &block)
instance.send(*args, &block)
end
end
end
end
end
明示的に定義されていないこのクラスで呼び出されるすべてのクラス メソッドがインスタンスに渡されるように、method_missing をオーバーライドします。これはシングルトンと同じように機能し、クラスで呼び出されたメソッドはすべてインスタンス メソッドとして機能します。しかし、Rails4 ソース コードでは、Module Configurable が使用されている場所が見つかりません。
そして同じ質問
class Engine < Railtie
def routes
@routes ||= ActionDispatch::Routing::RouteSet.new
@routes.append(&Proc.new) if block_given?
@routes
end
end
おっしゃる通り、routesメソッドもEngineのインスタンスメソッドです。しかし、MyApp の routes.rb では、ルートを定義します。
MyApp::Application.routes.draw do
#...
end
再びルート メソッドがクラス メソッドとして使用されるのはなぜですか? そして、私はこれを試します:
MyApp::Application.methods.grep(/routes/) #=> []
MyApp::Application.singleton_methods.grep(/routes/) #=> []
MyApp::Application.instance_methods.grep(/routes/) #=> [:routes]
では、魔法はどこで起こったのでしょうか。