2008-09-13 9 views

答えて

164

MVC

コントローラー:ここにコードを入れて、ユーザーが何を望んでワークアウト、そして、彼らは、特定のデータを参照する必要があるかどうか、彼らはログインしているかどうかを作業、それらを与えるために何を決めるに関係しています、等最後に、コントローラは要求を調べ、表示するデータ(モデル)とレンダリングするビューを決定します。コードがコントローラになければならないかどうか疑問に思っているなら、おそらくそうはならないでしょう。あなたのコントローラーはskinnyのままにしておきます。

ビュー:ビューは、あなたのデータ(モデル)を表示するには、最小限のコードを含める必要がありますが、それは処理や計算の多くを行うべきではありません、それはモデルにより算出し(または要約)データを表示しなければならない、またはコントローラから生成されます。あなたのビューが実際にモデルやコントローラではできない処理を行う必要がある場合は、コードをヘルパーに入れてください。ビュー内の多くのRubyコードは、ページのマークアップを読みにくくします。

モデル:あなたのモデルは、データに関連する場所すべてあなたのコード(サイトなどのユーザーを構成するエンティティ、ポスト、アカウント、友人など)でなければなりませんが住んでいます。コードでエンティティに関連するデータを保存、更新、要約する必要がある場合は、ここに入力します。ビューとコントローラー間で再利用可能になります。

ヘルパー:機能を簡単にビューを作成するようにするpauliephonicの答えに追加するには

+2

「スキニー」の素晴らしいリンク - MVCの優れた説明。 –

+2

人々は脂肪モデルから離れ始めています。 私は自分のモデルをデータ構造と考えています。次に、モデルをモデルで初期化するRubyオブジェクトを記述します(モデルは、文字列や配列をRails以外のオブジェクトのデータとして扱うのと同じ方法でデータとして扱われます)。 [Here's](http://arrrrcamp.be/videos/2011/corey-haines---fast-rails-tests/)このテクニックの例を紹介します。 –

+0

@AdamDonahue私は脂肪が何かが良いものと見なすことができないか分かりません。責任のトンはサービスに属する方が良い。 – fatuhoku

2

まあ、それは一種のロジックは、多くの場合、

...に対処しているかに依存し、それは小さなコントローラを残して、あなたのモデルに多くのものをプッシュする意味があります。これにより、モデルが表すデータにアクセスする必要がある場所であれば、このロジックを簡単に使用できます。ビューにはほとんどロジックが含まれていないはずです。だから、実際には、一般的に、あなたは自分自身を繰り返さないように努力すべきです。

また、グーグルでは、どこに行くのかの具体的な例がいくつか明らかになります。

モデル:検証要件、データ関係、メソッドの作成、メソッドの更新、メソッドの破棄、メソッドの検索(これらのメソッドのジェネリックバージョンだけでなく、何かがたくさんある場合は赤毛の人を姓で見つけたら、そのロジックを抽出して、find_redH_by_name( "smith")などを呼ぶだけです)

閲覧:これはすべてデータのフォーマットに関するものです、データの処理ではありません。

コントローラ:ここでデータ処理が行われます。インターネットから:「コントローラの目的は、ユーザが要求したアクションに応答し、ユーザが設定したパラメータをとり、データを処理し、モデルと対話し、要求されたデータを最終形式でビュー。 "

希望に役立ちます。

13

MVCパターンは実際にはUIのみに関係し、他には何も関係しません。ロジックを制御するのではなく、複雑なビジネスロジックをコントローラに配置しないでください。コントローラは、適切なビューを選択し、より複雑なものをドメインモデル(モデル)またはビジネスレイヤに委譲することに懸念する必要があります。

ドメイン駆動設計は、一般に、天然Modelクラスに属していないロジックを意味するオブジェクトのさまざまな種類の数を編成する必要がありますが、ロジックを貼る場所であるサービスの概念があります。

私は通常、サービスレイヤを自分のアプリケーションのAPIと考えています。私のサービスレイヤは、通常、私が作成しているアプリケーションの要件に非常によく似ています。したがって、サービスレイヤは、アプリケーションの下位レベルで見つかったより複雑なやりとりの単純化として機能します。つまり、サービスレイヤをバイパスする同じ目標を達成できますそれを機能させるためには、より多くのレバーを引く必要があります。

ここで私はあなたの特定の問題に対処する一般的な建築様式について話しています。

31

。たとえば、価格を表示するウィジェットのリストを常に繰り返している場合は、実際の表示の一部と一緒にヘルパーに配置します。または、あなたがRUBSの一部を持っていて、ビューを乱雑にしたくない場合は、それをヘルパーに入れてください。

+0

実際には、ヘルパーにsign_inメソッドも置いていませんか? RoRチュートリアルがここに示唆しているように>>> http://ruby.railstutorial.org/book/ruby-on-rails-tutorial#sec-a_working_sign_in_method –

7

は、コントローラ内の認証/アクセス制御に関連するものを入れてください。

モデルは、データについてのすべてです。検証、関係、CRUD、ビジネスロジック

ビューは、あなたのデータを示すとしています。入力のみを表示して取得する。

コントローラは、(およびビュー)ビューにし、あなたのビューからモデルへのモデルから何が起こったデータ管理に関するものです。コントローラは、モデルなしで存在することもできます。

私はあなたが窓口係(ビュー)質問をして、適切なカウンターに顧客(要求を)指示警備員/受付係としてコントローラと考えたいです。次に、窓口(ビュー)は、あなたが見たことがないマネージャ(モデル)からの回答を取得します。あなたはその要求を警備員/受付係(コントローラ)に返し、他の出納係(ビュー)の質問に応答してマネージャ(モデル)が彼らに言った答えを伝える別の出納係。あなたはその後、窓口係(ビュー)に何かを伝えたい場合

は、同様に、主に同じことを管理者があなたの情報を受け入れたかどうかを教えてくれる二出納除い起こります。また、情報を管理者に伝える権限がないので、警備員/受付(コントローラ)がハイキングをするように指示している可能性もあります。

私の常軌を逸した非現実的な世界では、窓口(景色)はきれいですが、しばしばあなたが話すものは信じていますが、警備員/受付は最低限礼儀正しくありませんが、人々は行かなくてはならず、管理者は実際には醜い意味を持ちますが、すべてを知っていて、真実とは何かを知ることができます。

5

正しく分離するのに役立つものは、「コントローラからビューにローカル変数を渡す」パターンを避けることです。この代わりに:

# app/controllers/foos_controller.rb: 
class FoosController < ApplicationController 

    def show 
    @foo = Foo.find(...) 
    end 

end 

#app/views/foos/show.html.erb: 
... 
<%= @foo.bar %> 
... 

ヘルパーメソッドとして利用可能であるゲッターにそれを移動してみてください:

# app/controllers/foos_controller.rb: 
class FoosController < ApplicationController 

    helper_method :foo 

    def show 
    end 

    protected 

    def foo 
    @foo ||= Foo.find(...) 
    end 

end 

#app/views/foos/show.html.erb: 
... 
<%= foo.bar %> 
... 

これは、それが簡単に「@foo」に入れます何を修正することになり、それがどのように中古。コントローラーとビューの分離をさらに複雑にすることなく増やします。

+0

uhmmm ... Yuk。あなたはこれを行うときのためにいくつかの良い理由/シナリオを追加してください。これはKISSとYAGNIを壊し、非常に臭いです(ちょうどもう1つの表現で投げます) – Sixty4Bit

+2

1)Railsはコントローラのインスタンス変数をビューインスタンスにコピーするために多くの魔法を使います。 2)提案された実装は、fooがアクセスされた場合にのみ読み込みます。重要な答えは本当に1)です。 – webmat

+11

*一言*これはひどいです。 Railsのインスタンス変数の共有は、アンチパターンではない機能です。現実の問題を引き起こすことはめったにない、遍在する、低精神的な文法的な砂糖です。あなたがそれを気に入らなければ、大丈夫ですが、バロックの非標準的な構造でそれをコーディングすると、事が無限に悪化します。この場合、効果的にfooをグローバル(コントローラごとに)変数にしています。スコープを大幅に増やすことによって、変数スコープの誤った使用を修正しようとするのは非常に皮肉なことです。 – gtd

-1

テスト、テスト... 可能な限り多くのロジックをモデルに入れておけば、正しくテストすることができます。単体テストはモデルをテストすることによってデータとその形成方法をテストし、機能テストはコントローラをテストすることによってルーティングまたは制御される方法をテストするため、データの整合性をテストすることはできませんモデル。すでにここ

J

10

パーフェクトな説明、結論と覚えやすいように1つの非常に簡単な文:

私たちは、SMARTモデル、THINコントローラ、およびDUMBビューを必要としています。簡単に言えば

http://c2.com/cgi/wiki?ModelViewController

0

、一般的に、 モデル(s)は、テーブルに関連するすべてのコードを持つことになり、その単純または複雑な関係(複数のテーブルを含むSQLクエリとして、それらを考えて)、操作ビジネスロジックを使用して結果に到達するためのデータ/変数の数。

コントローラには、要求されたジョブの関連モデルに対するコード/ポインタがあります。

Viewsは、ユーザー入力/対話を受け入れ、結果の応答を表示します。

これらから大きく外れていると、その部分に不必要な負担がかかり、アプリケーション全体のパフォーマンスに影響が出る可能性があります。

関連する問題