【发布时间】:2012-07-13 08:47:57
【问题描述】:
我有一些 Rails 代码不适合模型或控制器盒。所以按照this answer,我创建了一个app/classes 目录。 Rails 3 似乎会自动将此添加到 Rails 中的“加载路径”中,并且我的应用程序可以正确找到我在其中定义的类,而无需使用 require 语句。
但是app/classes 中的代码在开发模式下不会重新加载;如果我进行更改,我需要重新启动服务器才能看到更改。
在 Rails 3.2.x 中使给定目录“可重新加载”的正确方法是什么?这里推荐几个答案:
config.autoload_paths += %W(#{config.root}/app/classes)
但我相信这只是将app/classes 添加到初始目录集以在其中查找代码的效果;似乎并没有让它们为每个请求重新加载(此外,在 3.x 中,app/* 似乎是自动添加的)。
更新:
数字,我在发布问题后仅 30 秒就偶然发现了解决方案:
我的班级被包裹在一个模块中。一旦我删除了周围的“MyModule”,它突然变得可重新加载。来自 Java 背景,并且被污染全局命名空间的 Ruby 代码所烧毁,我养成了将所有内容都放在模块中的习惯。我猜 Rails “app” 代码必须存在于任何模块之外?
【问题讨论】:
-
尝试在
classes下用你的模块名创建一个子目录,然后把所有模块的类放在那里。我怀疑如果更改了名为bar.rb的文件,则仅在使用Bar类时才会重新加载,但如果全名实际上是Foo::Bar,则不会重新加载-然后它将查找名为foo/bar.rb的文件以重新加载.不过,只是猜测。
标签: ruby ruby-on-rails-3