2013-03-13 97 views
2

我想弄清楚rails 3的初始化。我知道每个应用程序都会在environment.rb中调用以下函数来初始化整个应用程序:MyApp :: Application.initialize!打电话?

MyApp :: Application.initialize!

从它我们应该期待初始化!是Rails :: Application的一个类方法。但是,我红色的源代码后,我发现,而不是初始化!是一个实例方法,它实际上是所谓:

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

那么,为什么被称为实例方法,虽然我们预计一个类的方法?有没有像方法委托或其他一些技巧?

+0

也许这可以帮助我在寻找一个类似的问题,到那个初始化!方法是。 http://climber2002.github.io/blog/2014/08/26/digging-rails-how-rails-initializes-itself-part-2/回到第一部分,如果你对现在是什么应用程序有疑问,而不是应用程序类。只与感兴趣的部分有关的漂亮列表非常棒。看看Rails MyApp的一个实例现在是如何使用一个实例变量的,我们可以将它发送给我们路径中的任何方法。感谢您的提问,因为这是一个很好的问题,奇怪的是,这次只有一个答案。 – 2015-09-17 16:20:12

回答

1

是的。有一个小技巧代表团。如果您查看railties gem中的文件lib/rails/railtie/configurable.rb,您将看到以下代表实例的代码。

def method_missing(*args, &block) 
    instance.send(*args, &block) 
end 

的情况下,你是不知道的method_missing挂钩的,你可以阅读更多的有关在这里:http://rubylearning.com/satishtalim/ruby_method_missing.html

+0

谢谢!我以前认为这个调用被委托给'Rails.initialize!',它只包含一行'application.initialize!',它是有道理的。我添加了一些调试打印,但发现Rails.initialize!在初始化过程中从未被调用过。我错过了'method_missing'这个人。所以还有另一个问题:为什么'Rails.initialize!'存在? – tomwang1013 2013-03-14 03:34:07

+0

这段代码已经存在好几年了,所以我会假设它最初用来调用Rails.initialize!用于初始化,但在某些时候,社区通过APP名称空间实现了初始化,并停止使用该方法。我不认为它在任何地方使用。也许你应该向铁轨提交一张票以反对它? – 2013-03-14 14:42:42