3

私の Rails 3.2 のモデル ディレクトリには、次の 2 つのクラスを含む "foo" フォルダーがあります。

# foo/bar.rb
class Foo::Bar; end

# foo/baz.rb
class Foo::Baz
  def self.test
    puts Bar.to_s
  end
end

Bar と Baz は同じモジュールにあるため、Foo::Baz.test は Foo::Bar を単に Bar として参照することに注意してください。

次に、コンソールを開いて Foo::Baz.test を 2 回呼び出します。

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 が単に Bar ではなく完全修飾名 Foo::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 に答える