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

前端之家收集整理的这篇文章主要介绍了ruby-on-rails-3 – 如何在开发模式下每个请求重新加载*文件后,如何挂接Rails *?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个基于用户配置选项动态设置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应用程序服务器中.

原文链接:https://www.f2er.com/ruby/267077.html

猜你在找的Ruby相关文章