【发布时间】:2019-02-01 10:28:51
【问题描述】:
我正在开发一个 gem,它根据用户配置选项动态设置 ActiveRecord 模型(例如 table_name)的属性。
我有一个可以实现这一点的初始化程序。然而,我的问题是,在开发模式下,这些类会重新加载,因此它们不会维护这些值集。
所以我想我会使用 railtie 连接到重新加载这些文件的位置,并在模型上再次运行我的配置。然而,我的问题是 railtie 中的 config.to_prepare 似乎在 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
那我reload!
reload!
来自我的 to_prepare 日志的 Rails 记录器:
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 之后运行回调,但它似乎仍然发生before 文件已重新加载...我得到与上述相同的行为。
【问题讨论】:
标签: ruby-on-rails-3