Rails 4.1无法自动加载命名空间类

时间:2014-06-08 22:08:27

标签: ruby-on-rails autoloader

我为嵌套资源的网址

做了一个帮手
# app/urls/url.rb
module Url; end

然后

# app/urls/base.rb
module Url
  class Base
    # common code
  end
end

当我尝试从Url::Base继承时,LoadError出现了:

Unable to autoload constant Base, expected xxx/app/urls/base.rb to define it

我已经调试了一下,文件是正确的来源并加载了类,但检查是错误的。当ActiveSupport::Dependencies#const_missing作为Object(< - 这是预期包含常量的变量)而不是from_mod时,错误似乎出现在Url中。
试试这个:

Url::Base # Raise LoadError
Url::Base # Works!

我仍然无法理解为什么const_missing触发Object而不是Url ...有些帮助?我做错了什么?


修改

好的,通过更多的挖掘,我明白了发生了什么。 Rails在namespace/class_name.rb中搜索文件的路径,如PATH;如果此文件不存在,它会尝试在父模块(或类)中加载常量,这就是它将使用form_model = Object递归的原因。

1 个答案:

答案 0 :(得分:0)

好的,通过更多的挖掘,我明白了发生了什么。 Rails在namespace/class_name.rb中搜索文件的路径,如PATH;如果此文件不存在,它会尝试在父模块(或类)中加载常量,这就是它将使用form_model = Object递归的原因。