【问题标题】:Rails::Application.initialize! method source locationRails::Application.initialize!方法源位置
【发布时间】:2013-11-05 11:38:40
【问题描述】:

我想在我的博客应用程序的 environment.rb 中找到以下行的来源

Blog::Application.initialize!

如果发现初始化!方法只在源代码的一处定义。

railties/lib/rails/application.rb

def initialize!(group=:default) #:nodoc:
  raise "Application has been already initialized." if @initialized

但是它是一个实例方法。

我在 rails 控制台做了一些实验:

Blog::Application.initialize!  # => Application has been already initialized
Blog::Application.method(:initialize!)  # => undefined method for Class
Blog::Application.instance_methods.include?(:initialize!)  # => true

奇怪的是,当 initialize! 显然可以在 Application 类上调用时,我们得到了一个未定义的方法。请帮助理解此代码。

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

这是由于一些 Ruby Magic 又名“方法缺失”:

Blog::Application.ancestors
=> [... Rails::Railtie::Configurable ...]

看看configurable.rb:

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

它将所有调用委托给底层应用程序实例。

【讨论】:

  • 说得通,回答了我的问题。但是,我很难理解 Rails::Railtie::Configurable 是如何包含在 Blog::Application 中的。它没有出现在 Rails::Application 的祖先中。如果您可以编辑答案以指出这一点,那将会很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多