我正在研究一个gem https://github.com/bradrobertson/apartment设置 ActiveRecord 模型的属性(例如table_name
)基于用户配置选项动态。
我有一个初始化程序可以实现这一点。然而我的问题是,在开发模式下,这些类会重新加载,因此它们不会维护这些值集。
所以我想我应该使用 Railtie 来连接这些文件重新加载的点并在模型上再次运行我的配置。然而我的问题是config.to_prepare
在 Railtie 中似乎在之前运行reload!
实际上发生了。我可以通过一些日志记录来证明这一点:
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
Then I reload!
reload!
我的 Rails 记录器to_prepare
logs:
Contact object_id: 2202692040
所以它仍然具有旧的 object_id,但是当我在控制台中检查它时:
Contact.object_id #=> 2197355080
这是新加载的类对象id。
那么我怎样才能得到to_prepare
to run after文件被重新加载?使用Rails 3.0.10
update
我还尝试手动将此操作附加到after_prepare
回调ActionDispatch::Callbacks
像这样:
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
但它似乎仍然发生before
文件被重新加载...我得到与上面相同的行为。