1

Ruby v1.9.2 と Ruby on Rails v3.2.2 を使用しています。定数ステートメントを持つ多くのモデル クラスがあります。例えば:

# app/models/class_one.rb
class ClassOne < ActiveRecord::Base
  CONSTANT_ONE = ClassTwo::CONSTANT_TWO
end

# app/models/class_two.rb
class ClassTwo < ActiveRecord::Base
  CONSTANT_TWO = 1
end

サーバーを再起動すると、次のエラーが表示されます。

Routing Error
uninitialized constant ClassTwo::CONSTANT_TWO
Try running rake routes for more information on available routes. 

エラーはファイル (およびクラス) の読み込み順序に関連していますか? どうすれば問題を解決できますか?

:Ruby on Rails以降、「機能する」解決策は、初期化ファイル(config/initializers/ディレクトリ内)で定数を状態にすることである可能性があると聞きました。もしそうなら、それはどのように適切な方法で行われるべきですか?についてどう思いますか?

4

2 に答える 2

0

Railsの定数は、あなたが見つけ始めているように、一種の苦痛です。苦痛は、実際に掘り下げるときにのみ増加します。定数を使用するよりも、クラスで実際のメソッドを使用する方がはるかに簡単で保守しやすくなります。たとえば、テストでは、さまざまなユースケースをカバーする場合、定数よりもメソッドを変更する方がはるかに簡単です。また、より複雑なプログラミングを行う場合、メソッドでは発生しないロードの問題(複数のロードエラー、または使用不可など)に陥り始める可能性があります。Railsアプリで定数を使用するのを完全にやめ、それらを少し見逃していません。AdviGrimmが同じ効果で書いた記事に興味があるかもしれません。

編集:

説明した方法で定数を本当に使用したい場合は、Ruby onRailsアプリケーションで定数を定義するのに最適な場所はどこですか?を確認してください。詳細については。

于 2012-11-09T00:36:58.837 に答える
0

これらの2つのクラスは同じファイルで定義されていますか?おお。クラスを並べ替えます。

class ClassTwo < ActiveRecord::Base
  CONSTANT_TWO = 1
end

class ClassOne < ActiveRecord::Base
  CONSTANT_ONE = ClassTwo::CONSTANT_TWO
end

それを修正する必要があります。CONSTANT_ONE = ClassTwo :: CONSTANT_TWOは、解析されるとすぐに評価されます。

于 2012-11-08T23:46:07.200 に答える