(Rails)如何在不重启服务器的情况下重新加载“lib”文件?

23
有没有在Rails中让ENV重新加载“lib”文件而无需重启服务器的方法?我正在使用“lib”中一个模块内的一些类。但是,为了看到我的更改,我必须每次重新启动服务器。我猜这就是Rails预期的工作方式,但是在开发库文件和/或插件时,这是相当繁琐的。 我肯定是做错了什么....? 编辑1:答案1和2对我都没有用。 相反,控制器出现了使用该模块的错误。 请注意,我在“lib / xmlitems”目录中有3个文件。 我尝试要加载该子目录,然后引用单个“require”所有其他文件的文件。 我是否需要逐个加载所有文件?

看了一下重复的目标,没有一个答案特别好。由于重复需要在目标中回答问题,所以我投票重新开放。 - Andrew Grimm
3个回答

14

对于Rails 3Rails 4.0,请按照@txwikinger答案中给出的说明进行操作。在您的environments/development.rb文件中添加以下行:

ActiveSupport::Dependencies.autoload_paths << File::join( Rails.root, 'lib')
ActiveSupport::Dependencies.explicitly_unloadable_constants << '<my modules in lib>'

1
工作得很好,尽管我从附加到“explicitly_unloadable_constants”的字符串中删除了括号。 - Alex Soto
2
这样可以让你重新加载lib目录中的类,对于rails 4已经确认。谢谢! - lfender6445
谢谢!我花了过去四个小时在Stack Overflow和Google上搜寻,尝试了很多不同的可能性。也许我花费的时间比这个工作节省的时间还要多,但我坚持原则——在请求之间自动重新加载文件应该是可行且容易的!你的答案在3.2.13上实现了这一点。再次感谢。 - Sherwin Yu
1
请注意,explicitly_unloadable_constants 数组是常量(类名)的数组,而不是文件名。还有一个问题:在第二次重新加载时,我遇到了一个异常:Circular dependency detected while autoloading constant MyClass - Paul
1
txwikinger的回答已被删除。 - Andrew Grimm
显示剩余4条评论

-1
module ActsAsReloadable
  def self.included(base)
    ActiveSupport::Dependencies.explicitly_unloadable_constants << base.name if Rails.env == 'development'
  end
end

要使用它,只需在 lib/* 文件中包含 ActsAsReloadable,并在 config/application.rb 中添加 config.autoload_paths += %W(#{config.root}/lib)。

-3

有一个更简单的方法:只需添加

config.reload_plugins = true

到 development.rb


这对我没用。 - Tyler Collier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接