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

前端之家收集整理的这篇文章主要介绍了ruby-on-rails-3 – 如何在开发模式下每个请求重新加载*文件后,如何挂接Rails *?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个基于用户配置选项动态设置ActiveRecord模型(如table_name)的属性gem.

我有一个初始化器来实现这一点.但是我的问题是,在开发模式下,这些类被重新加载,所以它们不会保持这些值的设置.

所以我以为我会用铁轨钩住这些文件被重新加载的位置,并在模型上再次运行我的配置.但是我的问题是,在重新加载之前,railstie中的config.to_prepare似乎运行!实际发生.我可以用一些记录证明这一点:

  1. module MyMod
  2. class Railtie < Rails::Railtie
  3.  
  4. config.to_prepare do
  5. Rails.logger.debug("Contact object_id: #{Contact.object_id}")
  6. end
  7. end
  8. end

如果我加载我的控制台,我得到第一个日志:

  1. Contact object_id: 2202692040

如果我检查Contact.object_id它匹配:

  1. Contact.object_id #=> 2202692040

然后我重新加载!

  1. reload!

从我的to_prepare日志中的Rails logger:

  1. Contact object_id: 2202692040

所以它仍然有旧的object_id,但是当我在控制台中检查它:

  1. Contact.object_id #=> 2197355080

哪个是新加载的类对象id.

那么如何在文件重新加载之后,如何获得to_prepare来运行?使用Rails 3.0.10

更新

我也尝试手动将此操作附加到ActionDispatch :: Callbacks上的after_prepare回调,如下所示:

  1. initializer "apartment.init" do
  2. ActionDispatch::Callbacks.set_callback(:prepare,:after) do
  3. Rails.logger.debug("Contact object_id: #{Contact.object_id}")
  4. end
  5. end

它确实在config.to_prepare之后运行回调,但是在重新加载文件之前它似乎仍然发生…我得到与上述相同的行为.

解决方法

编写一个初始化器,如果cache_classes为false,则使用 ActionDispatch::Reloader设置一个运行gem安装例程的to_prepare回调函数.
  1. initializer 'foobar.install' do
  2. if Rails.configuration.cache_classes
  3. FooBar.install!
  4. else
  5. ActionDispatch::Reloader.to_prepare do
  6. FooBar.install!
  7. end
  8. end
  9. end

它将在重新加载的控制台中工作!方法和Rack应用程序服务器中.

猜你在找的Ruby相关文章