@H_502_1@我正在开发一个基于用户配置选项动态设置ActiveRecord模型(如table_name)的属性的
gem.
我有一个初始化器来实现这一点.但是我的问题是,在开发模式下,这些类被重新加载,所以它们不会保持这些值的设置.
所以我以为我会用铁轨钩住这些文件被重新加载的位置,并在模型上再次运行我的配置.但是我的问题是,在重新加载之前,railstie中的config.to_prepare似乎运行!实际发生.我可以用一些记录证明这一点:
module MyMod class Railtie < Rails::Railtie config.to_prepare do Rails.logger.debug("Contact object_id: #{Contact.object_id}") end end end
如果我加载我的控制台,我得到第一个日志:
Contact object_id: 2202692040
如果我检查Contact.object_id它匹配:
Contact.object_id #=> 2202692040
然后我重新加载!
reload!
从我的to_prepare日志中的Rails logger:
Contact object_id: 2202692040
所以它仍然有旧的object_id,但是当我在控制台中检查它:
Contact.object_id #=> 2197355080
哪个是新加载的类对象id.
那么如何在文件重新加载之后,如何获得to_prepare来运行?使用Rails 3.0.10
更新
我也尝试手动将此操作附加到ActionDispatch :: Callbacks上的after_prepare回调,如下所示:
initializer "apartment.init" do ActionDispatch::Callbacks.set_callback(:prepare,:after) do Rails.logger.debug("Contact object_id: #{Contact.object_id}") end end
它确实在config.to_prepare之后运行回调,但是在重新加载文件之前它似乎仍然发生…我得到与上述相同的行为.
解决方法
编写一个初始化器,如果cache_classes为false,则使用
ActionDispatch::Reloader
设置一个运行gem安装例程的to_prepare回调函数.
initializer 'foobar.install' do if Rails.configuration.cache_classes FooBar.install! else ActionDispatch::Reloader.to_prepare do FooBar.install! end end end
它将在重新加载的控制台中工作!方法和Rack应用程序服务器中.