25

フォームフィールドの生成、送信されたフォームの値が有効かどうかの確認などに使用するため、Railsアプリのどこかに保存したいデータがあります。基本的に、データを1か所に保存する必要があります。いくつかの場所でそれ。

以前はinitialize、コントローラーでメソッドを定義し、そのメソッド内でインスタンス変数を初期化してい@graph_types = ['bar', 'line']ました。initializeこれは実際にはすべてが(これらの値の初期化に)使用されており、インスタンス変数は後で変更される可能性があるため、悪い考えのように思われましたが、これは望ましくありません。

ここで、コントローラーのメソッドの外部で、フィルターの直後の一番上に定数を定義し、それらをフリーズしますGraphTypes = ['bar', 'line'].freeze

このようなデータを構成ファイルに保存したくなかったのは、余分なファイルを追跡し、ファイルを読み込んで解析する必要があるためです。このデータをデータベースに保存したくなかったのは、やり過ぎのようです。利用可能なグラフタイプを別の定数と組み合わせて、クレイジーなLEFTOUTERJOINタイプのクエリを実行する必要はありませんThemes = ['Keynote', 'Odeo', '37 Signals', 'Rails Keynote'].freeze。このデータは特定のコントローラーにのみ関係するため、environment.rbにデータを保存したくありませんでした。

これらすべてを考慮して、私はこの「Rubyの方法」について行っていますか?

4

6 に答える 6

31

実際にはどこにも属さない定数のために、私は StaticData クラスを持っています。

  class StaticData

    GRAPH_TYPES = ['bar', 'line']

    SOMETHING_ELSE = ['A', 'B']

  end

それから私はそれを手に入れます

StaticData::GRAPH_TYPES
于 2008-12-13T02:45:42.540 に答える
12

以前に同様の質問に書いたのと同じ回答が適用され、この回答が引き続き検索結果に表示されるため、投稿します。

定数はコントローラーに直接関係するため、コントローラーに定数を配置することにはある程度の意味があります。それ以外の場合、定数は専用の初期化ファイルに配置する必要があります: Rails.root/config/initializers/constants.rb.

application.rb に記載されているコメントによると:

# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded

これは Rails 3 の時点でも有効です。

于 2011-11-09T22:33:23.667 に答える
10

あなたが現在していることは問題ないと思います。データは 1 つのコントローラーにのみ関係するとおっしゃっていたので、そこに属します。複数のコントローラーに必要な場合、または定数値よりも複雑な場合は、他のアプローチが理にかなっている可能性があります。

于 2008-12-11T23:03:16.010 に答える
3

IDBDとparadisepeteに同意します。モデルで定数を使用するのが、コントローラーがスキニーでモデルが太くなるようにするための最良の方法です。Railsビューのヒントを参照してください 。たとえば、メトリックモデルにリンクされたメトリックコントローラーがある場合。メトリックモデルクラスでMetric<ActiveRecord:: Base GRAPHTYPES = ['bar'、'line']

次に、ビューで次のようなことを行うことができます

f.select:graph_type、Metric :: GRAPHTYPES

于 2009-06-18T10:19:21.993 に答える