在我的Rails 3.2 models目录中,我有一个包含两个类的文件夹“foo”:
# foo/bar.rb
class Foo::Bar; end
# foo/baz.rb
class Foo::Baz
def self.test
puts Bar.to_s
end
end
请注意,Foo :: Baz.test将Foo :: Bar简称为Bar,因为Bar和Baz位于同一个模块中。
然后我打开控制台并两次调用Foo :: Baz.test:1.9.3-p0 :001 > Foo::Baz.test
Foo::Bar
=> nil
1.9.3-p0 :002 > Foo::Baz.test
NameError: uninitialized constant Foo::Baz::Bar
from /../app/models/foo/baz.rb:2:in `test'
正如您所看到的,第一次呼叫正常,然后每次都崩溃。为什么呢?
如果Foo :: Baz使用完全限定名称Foo :: Bar而不是Bar,那么不会发生。
答案 0 :(得分:2)
如果您单独声明模块,它似乎有效:
# foo/bar.rb
module Foo
class Bar; end
end
# foo/baz.rb
module Foo
class Baz
def self.test
puts Bar.to_s
end
end
end
$ rails console
Loading development environment (Rails 3.2.6)
1.9.3-p125 :001 > Foo::Baz.test
Foo::Bar
=> nil
1.9.3-p125 :002 > Foo::Baz.test
Foo::Bar
=> nil
1.9.3-p125 :003 >
我无法解释原因。