0

私からしてみれば:

  <%= f.collection_select :product_id, Product.find(:all), :id, :name %>

Product.find(:all)上記のコードで参照しています。

または、モデルで関数を定義し、それをビューで呼び出す場合もあります。ModelName.my_function

そうでなければ!MVCの原則に従わずにそれを行う最良の方法は何ですか?

つまり、それは私たちが従うことができる最高のアーキテクチャですか、それとも何か他のものがありますか?

4

3 に答える 3

2

ビューは(一般的に)モデルと直接やり取りすべきではありません

経験則として、ビューはモデルと直接通信すべきではありません。この原則に違反することが理にかなっている場合もありますが、これ以上の文脈がなければ、これはそれらの1つではないと思います.

MVC の Rails バージョンでは:

  1. モデルは動作を定義する必要があります。
  2. コントローラーは、モデルとコレクションをインスタンス変数に割り当て、ビューに渡します。
  3. ビューは、コントローラーからインスタンス変数として渡されたモデルの属性をフォーマットする必要があります。
  4. 場合によっては、コントローラーから渡されたオブジェクトでメソッドを呼び出すことが保証されますが (すべてがコントローラーによって変数に事前計算される必要はありません)、ビューはモデルを直接呼び出すべきではありません。

すべての OOP と同様に、マイレージは確かに異なる場合があります。

于 2013-05-22T14:21:41.503 に答える
1

それはMVCとほぼ同じです。

この単純なケースでのコントローラーの役割は、正しいモデルを正しいビュー (仲介) で利用できるようにすることです。Rails のおかげで、実際にコントローラ コードを記述する必要はありませんでした。これが、Rails MVC フレームワークの要点のようなものです。アプリケーションからありふれたボイラープレート パターンの実装を排除します。

意味的には、ビューで Products.find(:all) を使用することと、コントローラーで @products = Products.find(:all) を割り当ててから、ビューで @products を参照することは同じことですが、なぜ故意により多くのコードが必要ですか?(後でリファクタリングする必要がある場合は、簡単ですが、時期尚早にリファクタリングしないでください。そうしないと、クラフトになってしまいます)。

また、Rails はクエリを (リクエストの存続期間中) キャッシュするため、同じビューで Products.find(:all) を何度も使用しても、パフォーマンスには何も影響しません。

クエリのスコープを設定する場合は、モデル内で行います。この場合も、コントローラー コードは必要ありません。

コントローラーコードが必要になるのはいつですか? おそらく、承認またはドメイン固有のロジックを実行するため、または JSON などの代替 (HTML ではない) 形式で応答する必要があります。

于 2013-05-22T14:01:07.070 に答える
1

( V ) ビューは ( M ) モデルと直接対話するべきではありません。これはProduct.find(:all)が行っていることです。理想的には、コントローラーからローカル変数をビューに渡すことです。

それが独断的に正しい方法であるにもかかわらず、ローカル変数を介して最後のすべての変数を渡すことが実際的でない場合があります。そのような場合は、代わりにヘルパーを作成することを検討する必要があります。そうすれば、より意味的な意味を持つことができます:

 <%= f.collection_select :product_id, Product.find(:all), :id, :name %>

になる

 <%= f.collection_select :product_id, product_options_for_select, :id, :name %>

次のようなヘルパーが関連付けられています。

def product_options_for_select
  Product.find(:all)
end

これにより、特に再利用する場合、将来異なるサブセットを返す必要がある場合に備えて、少なくとももう少し保守しやすくなります。

于 2013-05-22T14:54:39.587 に答える