【问题标题】:Rails 3.2.x: how to reload app/classes dir during development?Rails 3.2.x:如何在开发过程中重新加载 app/classes 目录?
【发布时间】: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


【解决方案1】:

您是在单独的文件中声明了模块,还是在类中隐式声明了它?这可能会对自动加载行为产生影响。 module Foo; class Barclass Foo::Bar。如果 Rails 自动加载器找不到与 Foo 模块一起使用的 foo.rb,它可能会跳过重新加载它。

【讨论】:

  • 模块在同一个文件中声明,例如:Module Foo;类 Bar,然后在整个代码中称为 Foo::Bar。
  • 可能值得尝试拥有一个单独的模块文件,以便在类/模块和文件之间建立 1:1 的关联。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多