加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails-3 – 如何在开发模式下每个请求重新加载*文件后,

发布时间:2020-12-16 21:40:15 所属栏目:百科 来源:网络整理
导读:我正在开发一个基于用户配置选项动态设置ActiveRecord模型(如table_name)的属性的 gem. 我有一个初始化器来实现这一点.但是我的问题是,在开发模式下,这些类被重新加载,所以它们不会保持这些值的设置. 所以我以为我会用铁轨钩住这些文件被重新加载的位置,并在
我正在开发一个基于用户配置选项动态设置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应用程序服务器中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读