自动重新加载导轨模块

时间:2010-01-24 23:55:20

标签: ruby-on-rails

我正在开发一个我在rails应用程序中包含的ruby模块。我希望它在更改时自动重新加载。我已经做了大量的谷歌搜索,并查看了讨论它的各种问题,但它们似乎都过时或错误。

如何更改外部模块在rails中重新加载?我已尝试将其名称添加到ActiveSupport::Dependencies.unloadable_constants,但在我在控制台中输入reload!后,即使我执行另一个NameError: uninitialized constant foo,我也无法再引用该符号require 'foo_module' 1}}。有谁知道如何使这个工作?

注意:这里是one possible dup,但请注意“答案”的注释,它从未解决过模块的问题。还有this question在答案中有一个死链接,最后this one,它也没有解决它。

3 个答案:

答案 0 :(得分:5)

我发现了如何做到这一点:

  1. 确保FooModule位于lib/foo_module.rb
  2. 使用require_dependencylib/foo_module.rb。{/ li>中要求使用外部库

    这些步骤都是必需的,不需要其他步骤。

答案 1 :(得分:1)

这里有两个不同的问题。

当您需要require时,更简单的是使用load

  • require将评估文件中的代码一次,无论该文件/模块需要多少次。

  • load将在每次加载文件时评估文件中的代码。

require首选加载使用,以便在许多文件依赖它们时不会多次评估文件。

简短版本是load可用于重新加载已由require加载的模块。


更复杂的问题是在更改时自动重新加载模块。

问题中列出的一个可能的重复项链接到here。如果自加载以来已经更改,那么建议将依赖于模块的任何代码加上模块的条件加载前缀。您需要使用全局变量来跟踪文件的加载时间。

N.B。:这不应该在生产服务器上使用,但在开发服务器或控制台上应该没问题。

答案 2 :(得分:0)

我有时也会研究这个问题。

这是我在how to auto-reload require files in Rails没有重启服务器的调查结果。

该解决方案现在可以作为Ruby gem require_reloader使用。