2

私のアプリケーションコードは、Rails3.2で以下に示すように構成されています。Railsコンソールにアクセスして入力Foo::Bar::FooBarすると、次の警告が返されます。

warning: toplevel constant FooBar referenced by Foo::Bar::FooBar

それらが配置されているアプリケーションコードとファイル:

# app/models/foo/bar/foo_bar.rb
module Foo
  class Bar
    class FooBar
    end
  end
end

# app/models/foo/bar.rb
module Foo
  class Bar
  end
end

# app/models/foo_bar.rb
class FooBar
end

自動ロードパスは、Railsのデフォルトから変更されていません。

この問題を修正する方法の1つは、に次のコードを追加することFoo::Bar::FooBarです。しかし、それは汚れているように感じ、問題を解決するための構成オプションまたは私が間違っている他の何かがあるかどうか疑問に思いました。

# app/models/foo/bar/foo_bar.rb
module Foo
  # This line of code removes the warning and makes class methods execute
  # on the Foo::Bar::FooBar class instead of the FooBar class.
  class Bar; end

  class Bar
    class FooBar
    end
  end
end
4

1 に答える 1

0

基本的な問題は、重複するスコープで、異なるクラスに同じ名前を再利用していることです。Ruby が定数名を思いどおりに解決できるようにするには、何か巧妙な方法を講じることができるかもしれませんが、この種の「解決策」は根本的に脆いものです。(Ruby の新しいバージョンで定数の検索方法が少し変更されたり、別の Ruby 実装に移行した場合はどうなるでしょうか?)

FooBarモジュール内のトップレベルのモデル クラスに名前空間を付けないのはなぜですか? (モジュールと同じ名前のサブディレクトリにファイルを移動する必要があります。)

于 2012-11-14T21:24:26.087 に答える