如何从初始化程序扩展类并在开发环境中重新加载?

Kri*_*ris 11 ruby ruby-on-rails

我通过包含一个模块来扩展一个类(在插件中),这是在初始化器中完成的.

require 'qwerty/core/user'
User.send :include, Qwerty::Core::Extensions::User
Run Code Online (Sandbox Code Playgroud)

但是在开发之前,每个请求(以及在控制台中调用reload!之后)都会重新加载所有模型,但由于初始化程序不会再次运行,因此不包含该模块.留下"缺少部件"的模型.

因为模型是在插件中,所以直接在类中包含代码似乎是明智的,这是通常的方法.

现在我只是添加了一个before_filter,它包含了在开发环境中的模块.但我已经复制/粘贴并在初始化程序和应用程序控制器中有重复的代码.

  # Class extensions in initalizers are over-writtern each request
  def development_loading
    if RAILS_ENV == 'development'      
      User.send :include, Qwerty::Core::Extensions::User
    end
  end
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

作为旁注,插件是我的,所以我可以添加代码,但模块中保存的扩展可能并不总是存在...

Kri*_*ris 11

的environment.rb

config.to_prepare do
  User.send :include, Qwerty::Core::Extensions::User
end
Run Code Online (Sandbox Code Playgroud)

代码是块在开发模式中的每个请求之前运行,并且在生产模式下运行一次.


foz*_*foz 6

在Rails 3.x中,您可以配置块以在每次重新加载时运行(在开发模式下或何时config.cache_classes = false).这将在初始化器中进行:

ActionDispatch::Callbacks.to_prepare do
    # configure stuff or initialize
end
Run Code Online (Sandbox Code Playgroud)