Ruby on rails 3 在开发模式下,在每个请求上重新加载*文件之后,如何连接到Rails*?
我正在开发一个基于用户配置选项动态设置ActiveRecord模型(如Ruby on rails 3 在开发模式下,在每个请求上重新加载*文件之后,如何连接到Rails*?,ruby-on-rails-3,Ruby On Rails 3,我正在开发一个基于用户配置选项动态设置ActiveRecord模型(如表\u name)属性的应用程序 我有一个初始化器实现了这一点。然而,我的问题是,在开发模式下,这些类会被重新加载,所以它们不会维护这些设置的值 所以我想我应该使用railtie来钩住这些文件被重新加载的点,然后在模型上再次运行我的配置。然而,我的问题是,railtie中的config.to_prepare似乎在重新加载之前运行实际发生。我可以通过一些日志来证明这一点: module MyMod class Railtie
表\u name
)属性的应用程序
我有一个初始化器实现了这一点。然而,我的问题是,在开发模式下,这些类会被重新加载,所以它们不会维护这些设置的值
所以我想我应该使用railtie来钩住这些文件被重新加载的点,然后在模型上再次运行我的配置。然而,我的问题是,railtie中的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\u id
它匹配:
Contact.object_id #=> 2202692040
然后我重新加载代码>
reload!
Rails logger从my到_prepare
日志:
Contact object_id: 2202692040
所以它仍然有旧的object_id,但是当我在控制台中检查它时:
Contact.object_id #=> 2197355080
这是新加载的类对象id
那么,如何让在重新加载文件后准备运行?使用Rails 3.0.10
更新
我还尝试手动将此操作附加到ActionDispatch::Callbacks
上的after\u 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
之后运行回调,但在文件重新加载之前,它似乎仍然会发生。。。我得到了与上面相同的行为。我相信Rails重载程序只会卸载常量。在应用程序中引用常量时,模型会自动加载
在回调中,我认为您必须通过引用所有模型手动触发加载。也许你的gem可以保留一个包含它的所有模型的列表,然后只需引用常量就可以自动加载它们
model_names.each { |model_name| model_name.constantize }
您可以使用以下内容构建列表:
编写一个初始值设定项,如果cache\u classes
为false
,则使用该初始值设定项设置以准备运行gem安装例程的回调
initializer 'foobar.install' do
if Rails.configuration.cache_classes
FooBar.install!
else
ActionDispatch::Reloader.to_prepare do
FooBar.install!
end
end
end
它可以在控制台中使用重新加载代码>方法和在Rack application server中。您是否尝试过类似于在缓存类时准备
,所以您可以只做:{ActionDispatch::Reloader.to_prepare do FooBar.install!end}初始值设定项对我不起作用,但我删除了它,它起了作用,在文档中很难找到这样的东西,感谢新的Rails版本5.x,我们需要使用ActiveSupport::Reloader.to_prepare
而不是ActionDispatch::Reloader.to_prepare
为新的Rails版本6.x,我们现在必须使用Rails.application.reloader.to_prepare
而不是ActiveSupport::reloader.to_prepare
module MyGem
self.included(base)
@model_names ||= Set.new
@model_names += base.to_s
end
end
initializer 'foobar.install' do
if Rails.configuration.cache_classes
FooBar.install!
else
ActionDispatch::Reloader.to_prepare do
FooBar.install!
end
end
end