【问题标题】:How to reload gem for every request in Rails 3.2? [duplicate]如何为 Rails 3.2 中的每个请求重新加载 gem? [复制]
【发布时间】:2012-02-12 02:03:08
【问题描述】:

如何为每个请求强制重新加载 gem?

我开发了一个 gem,并希望每次在浏览器中刷新页面时都重新加载我的 gem 代码。我的宝石文件:

gem "my_gem", :path => "../my_gem"

为了解决这个问题,我尝试了 stakoverflow 中列出的所有建议。没有任何帮助。还发现了两个 Rails 配置参数:watchable_dirs 和 watchable_files。尝试使用它们,但它们也不适合我。

【问题讨论】:

  • 有人要问:为什么?你想解决什么问题?
  • @Jordan 问题很明显:因为他正在开发一个 gem,所以他想无缝地更改和调试它。
  • 我猜,您应该要求您的 gem 在它的初始化文件中带有 to_prepare 语句,请参阅 guides.rubyonrails.org/configuring.html#initialization-events
  • @apneadiving 我在 development.rb 中尝试了两个选项:(1) MyApp::Application.configure do config.to_prepare do require "../my_gem/lib/my_gem/helper.rb" end end (2) ActionDispatch::Callbacks.to_prepare do require "../my_gem/lib/my_gem/helper.rb" end 没有任何帮助。怎么了?
  • @apneadiving 如果您查看修订历史记录,您会发现它最初并不明显,尽管这肯定是我的猜测。

标签: ruby-on-rails ruby-on-rails-3.2


【解决方案1】:

您应该使用 ActiveSupport::Dependencies unloadable 方法将要重新加载的类标记为可卸载;

class YourClass
  unloadable
end

http://apidock.com/rails/ActiveSupport/Dependencies/Loadable/unloadablehttp://robots.thoughtbot.com/post/159805560/tips-for-writing-your-own-rails-engine

应该给你一些背景。或者,您可以像这样自己重新加载;

Object.send(:remove_const, 'YOUR_CLASS') if Object.const_defined?('YOUR_CLASS')
GC.start
load 'path/to/your_file.rb'

【讨论】:

  • 问题是我构建了一个模块,然后将其包含到 ActionView 中:ActionView::Base.send :include, MyGem::Helper。所以我没有课。在这种情况下我应该使用方法'unloadable'?
  • 完美,这为我解决了问题!我只是将unloadable if Rails.env.development? 放入我的模块中,它就像一个魅力。谢谢!
【解决方案2】:

为此我已经引用了一些内容,但最终还是经历了一些尝试和错误。

lib/my_gem/my_gem.rb:

require 'active_support/dependencies'
ActiveSupport::Dependencies.autoload_paths += [File.expand_path("..", __FILE__)]

module MyGem
  include ActiveSupport::Dependencies
  unloadable
end

请务必将“unloadable”添加到您的所有类中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2011-06-10
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多