Railsのコントローラについて、しっくりこない点があった。たとえば、下記のようなコード。
class ExampleController < ActionController::Base
def show
@data1 = ExampleModel1.find params[:key1]
@data2 = ExampleModel2.find params[:key2]
@data3 = ExampleModel3.find params[:key3]
end
end
これだと、ビュー側で @data3 の表示が不要になったときに、コントローラのコードをいじる必要が生じる。厳密にはいじらなくてもよいが、いじるかどうか検討する必要は生じる。変更に弱い、ということだ。
ビューがモデルを直接参照していれば、そうはならない。本来、MVCではビューがモデルを参照するのが当たり前。WebアプリのMVCモドキでも、そうするメリットがあるのだ。
結局、コントローラの仕事は「モデルの更新、ビューの決定」のみに留めるべきだと思う。モデルの参照はビューの仕事。
モデルの変更や出力に関わるバリデーションをコントローラで行うのも、変更に弱いやり方だろう。たとえば(必須項目が漏れているなどの)モデルの更新に関わるものであればモデルに任せればよいし、(表示ページ番号などの)出力に関わるものであればビューに任せればよい。コントローラがバリデーションすべきは、更新対象となるモデルや、出力処理を任せるビューを決めるためのパラメータだけだ。
実際には、そのようなパラメータはほぼ使われないだろう。更新対象となるモデルや、出力を任せるべきビューは、アクションごとにおのずと決まるはずだ。つまり、コントローラでバリデーションすべきパラメータはまずない、ということだ。
