Railsアプリのどこかに保存したいデータがあります。これは、フォームフィールドの生成、送信されたフォームの値の有効性の確認などに使用するためです。基本的には、複数の場所で利用しているため、1か所のデータ。
以前は、コントローラーでinitialize
メソッドを定義し、そのメソッド内でインスタンス変数を初期化していました。 @graph_types = ['bar', 'line']
。これは、実際にはすべてのinitialize
が(これらの値の初期化)に使用されており、インスタンス変数が後で変更される可能性があるため、悪い考えのように思われましたが、これは望ましくありません。
ここで、コントローラーのメソッドの外部で、フィルターの直後の上部に定数を定義し、それらをフリーズします。 GraphTypes = ['bar', 'line'].freeze
。
このようなデータを構成ファイルに保存したくなかったのは、余分なファイルを追跡したり、ファイルを読み込んで解析したりする必要があるためです。このデータをデータベースに保存したくなかったのは、やり過ぎのようです。利用可能なグラフタイプを別の定数、たとえばThemes = ['Keynote', 'Odeo', '37 Signals', 'Rails Keynote'].freeze
と組み合わせて、クレイジーなLEFT OUTERJOINタイプのクエリを実行する必要はありません。このデータは特定のコントローラーにのみ関係するため、environment.rbにデータを保存したくありませんでした。
これらすべてを考慮して、私はこれについて 'Ruby方法'?
あなたが現在していることは大丈夫だと思います。データは1つのコントローラーにのみ関係しているため、そこにデータが属しているとおっしゃいました。複数のコントローラーに必要な場合、または定数値よりも複雑な場合は、他のアプローチが理にかなっている可能性があります。
実際には他のどこにも属していない定数については、StaticDataクラスがあります。
class StaticData
GRAPH_TYPES = ['bar', 'line']
SOMETHING_ELSE = ['A', 'B']
end
それから私はそれを手に入れます
StaticData::GRAPH_TYPES
同じ答え 私は以前に同様の質問に書いた 適用され、この答えはまだ検索結果に表示されるので投稿します。
定数はコントローラーに直接関係するため、コントローラーに定数を入れることには意味があります。それ以外の場合、定数は専用の初期化ファイルに入れる必要があります: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。 の時点でまだ有効です
はい、あなたがしていることは大丈夫です。ただし、定数をGRAPH_TYPES
と呼ぶ方が、より慣用的なRuby)です。
ちなみに、コントローラーでinitialize
を定義することは避けます。トラブルにつながる可能性があるようです。
IDBDとparadisepeteにいくらか同意します。モデルで定数を使用するのが、コントローラーが細く、モデルが太くなるようにするための最良の方法です。 Railsビューのヒント を参照してください。たとえば、メトリックモデルにリンクされたメトリックコントローラーがある場合。メトリックモデルクラスでMetric <ActiveRecord :: Base GRAPHTYPES = ['bar'、 'line']
次に、ビューで次のようなことを行うことができます
f.select:graph_type、Metric :: GRAPHTYPES
あるリソースに関連するフォームを生成している場合は、それをモデルに保存することをお勧めします。単純なクラスまたはインスタンスの変数/メソッドである可能性があるため、DBに保存する必要はありません。
同じ考えが検証のためのものです。リソース/モデルインスタンスを検証する場合は、モデルクラス内に検証パラメータを保存するのが妥当です。
とにかく、それはあなたが言及したどの変種よりも「厚いモデルと薄いコントローラー」のパターンにはるかに近いでしょう。