我有一些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”代码必须存在于任何模块之外?
答案 0 :(得分:2)
您是否在单独的文件中声明了该模块,或者您是否在类中隐式声明了该模块?这可能会影响自动加载行为。 module Foo; class Bar
与class Foo::Bar
。可能是如果Rails自动加载器找不到与{Foo模块一起使用的foo.rb
,它可能会跳过重新加载它。