gpt4 book ai didi

ruby-on-rails-3 - 在开发模式下,如何在每个请求上重新加载文件后 * 挂接到 Rails?

转载 作者:行者123 更新时间:2023-12-04 00:53:15 25 4
gpt4 key购买 nike

我正在处理 gem根据用户配置选项动态设置 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

然后我 reload!
reload!

来自我的 Rails 记录器 to_prepare日志:
Contact object_id: 2202692040

所以它仍然有旧的object_id,但是当我在控制台中检查它时:
Contact.object_id  #=> 2197355080

这是新加载的类对象 id。

那么我如何获得 to_prepare重新加载文件后运行?使用 Rails 3.0.10
更新

我也尝试手动将此操作附加到 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文件被重新加载......我得到了与上面相同的行为。

最佳答案

写一个初始化器,如果 cache_classesfalse , 使用 ActionDispatch::Reloader 设置一个 to_prepare运行您的 gem 安装例程的回调。

initializer 'foobar.install' do
if Rails.configuration.cache_classes
FooBar.install!
else
ActionDispatch::Reloader.to_prepare do
FooBar.install!
end
end
end

它可以在控制台中使用 reload! 工作方法并在 Rack 应用服务器中。

关于ruby-on-rails-3 - 在开发模式下,如何在每个请求上重新加载文件后 * 挂接到 Rails?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7504744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com