3

在我的 Rails 3.2 模型目录中,我有一个文件夹“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,则不会发生这种情况

4

1 回答 1

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 > 

我无法解释为什么。

于 2012-06-24T18:44:36.890 回答