1

私の知る限り

 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]

では、魔法はどこで起こったのでしょうか。

4

0 に答える 0