MVCについて
よく見るMVCの図
もちろんこれは筋が通ってる。
①ブラウザとかのクライアントサイドからアプリへリクエストを送る。
②それを routes.rb が解釈して該当のコントローラとアクションを探す。
③コントローラはHTTPリクエストのパラメータを受け取ってアクションを実行する。その際必要に応じてモデルにアクセスし、データを渡したり受け取ったりする。
④モデルはDBにアクセスして、各自メソッドを実行する。
⑤コントローラはモデルとのやりとりを通してCRUDなどの処理を実行し、自分のviewを呼び出して、結果の値をインスタンス変数に入れて渡す。
⑥viewがコンパイルされて、htmlとしてブラウザに表示される。
僕がイメージするMVC
コントローラの中にモデルが点在していて、それぞれDBにアクセスし、コントローラの任務を実行・手助けする。コントローラ名とそこにいるモデルは必ずしも結びついていない。会社に例えるとコントローラは部署で、その中にアクションという業務がある(アクションは基本的にCRUDのみ)。
インスタンスに仕事を覚えてもらう
社員にあたるのがモデルのインスタンス。社員の行動は社内規定にあたるモデルのクラス定義の制約を受けている。クラス定義にモデルにやってもらいたい仕事を書いておけば、便利な仕事のスキルを社員に予め仕込んでおくことができる。そうすれば、コントローラ内で指示すべきことが減り、インスタンスに「アレやっといて」というだけでキチンと業務をこなしてくれる。つまり、優秀な社員が手に入る。結果的にコントローラが薄くなって混乱が起こりにくくなる。
コントローラの処理もまとめる
ただし、社員に仕込むスキルは彼自身(データ)に結びつくものであるべきで、そうでない処理についてはコントローラ内にプライベートメソッドとしてまとめる。別の部署でも共通の業務であれば ApplicationController にまとめておく。