【发布时间】:2011-07-08 07:53:05
【问题描述】:
类似的问题已经被问过很多次了。但是,我的情况略有不同,在开发 Rails 3 应用程序时,我仍然要找到以下问题的干净解决方案:
我有一个位于单个文件中的 ruby 代码。这段代码是一个模块MyModule,其中包含一堆类。我无法修改此代码,因为它是由外部工具自动生成的。文件名为my_module.rb,位于lib 文件夹中。这是不属于主 Web 应用程序的代码的常见位置。通过修改application.rb 中的config.autoload_paths 设置,我确保在我的一个应用控制器中访问MyModule 后它会自动加载。
现在我需要重新打开MyModule 中的一个课程。我创建了一个单独的文件some_class.rb,在其中放置了以下代码:
我的问题是:放置此代码的最佳位置是什么?文件名应该是什么?
我尝试过的事情:
- 将代码放入
initializers文件夹。它在生产环境中运行良好。但是,它在development中中断,因为initiliazers文件夹中的代码在服务器启动时加载一次,并且在每次请求时重新加载lib。因此,开发中的第一个请求工作正常,但是,后续请求失败。另外我不喜欢将代码放入initializers,因为它不是真正的初始化部分,而是业务逻辑的一部分。 - 将代码放入
lib文件夹也不起作用。它没有加载。只有my_module.rb是。 - 将代码放入
lib或app下的其他文件夹中,然后在控制器中明确requir将其放入。再次,它在生产中工作,但在开发中失败,原因与案例 #1 中提到的相同。 - 我关闭了自动加载,将
my_module.rb和some_class.rb放入lib文件夹,require将它们放入初始化程序中。我认为这是最好的方法。缺点是我仍然需要创建一个自定义初始化程序,并且代码不会延迟加载。
更新:
5. 感谢 raggi 的建议,开启自动加载后,我将require_dependency 'some_class' 放入我的控制器中。在这种情况下,some_class.rb 在开发模式下被加载到每个请求上。这是我的首选方法。但是,它仍然需要某种require :)
请记住,lib 文件夹中的文件是延迟自动加载的。只有当您使用 rails 找不到的模块或类时,Rails 才会检查该文件夹。文件名必须遵循命名约定,因此命名为my_module.rb。
我想知道当两个文件都被延迟自动加载时是否有解决方案没有任何require语句。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3