ruby-on-rails-3 – 如何在开发模式下每个请求重新加载*文件后,
我正在开发一个基于用户配置选项动态设置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应用程序服务器中.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |