web-dev-qa-db-ja.com

Rails

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方法'?

23
Sarah Vessels

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

9
J Cooper

実際には他のどこにも属していない定数については、StaticDataクラスがあります。

  class StaticData

    GRAPH_TYPES = ['bar', 'line']

    SOMETHING_ELSE = ['A', 'B']

  end

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

StaticData::GRAPH_TYPES
30
user37011

同じ答え 私は以前に同様の質問に書いた 適用され、この答えはまだ検索結果に表示されるので投稿します。

定数はコントローラーに直接関係するため、コントローラーに定数を入れることには意味があります。それ以外の場合、定数は専用の初期化ファイルに入れる必要があります: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。 の時点でまだ有効です

11
Sasha

はい、あなたがしていることは大丈夫です。ただし、定数をGRAPH_TYPESと呼ぶ方が、より慣用的なRuby)です。

ちなみに、コントローラーでinitializeを定義することは避けます。トラブルにつながる可能性があるようです。

4
Daniel Lucraft

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

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

f.select:graph_type、Metric :: GRAPHTYPES

3
Anthony

あるリソースに関連するフォームを生成している場合は、それをモデルに保存することをお勧めします。単純なクラスまたはインスタンスの変数/メソッドである可能性があるため、DBに保存する必要はありません。

同じ考えが検証のためのものです。リソース/モデルインスタンスを検証する場合は、モデルクラス内に検証パラメータを保存するのが妥当です。

とにかく、それはあなたが言及したどの変種よりも「厚いモデルと薄いコントローラー」のパターンにはるかに近いでしょう。

1
IDBD