Rails controllerの動きについて
routeの設定やcontrollerの記述だけで、viewのレンダリングやデータの渡しなどRailsが自動的に動いてくれるとはわかるけど、でもどうやってできたの?って素朴な疑問があったのでちょっと調べてみた。
面白いと感じたので、メモしておく。
URLにアクセスした後、controllerの動き
仮に/boards/indexにアクセスしたら、Rails は関連のcontrollerインスタンスを作成する。イメージ例:
kontroller = BoardsController.new
routingのマッピングによって、この
kontroller
インスタンスはindex
メソッドを実行する。@boards
などのインスタンス変数に関連データを保存する。index
メソッドの最後の動きとしてデフォルトでindex.html.erb
をレンダリングしようとする。
controllerメソッドの戻り値
- Rubyではメソッドの最後にreturnを明記する必要がないが、indexメソッドは最後に評価する式は
return render 'index'
と思っても良い - つまり戻り値はレンダリングしたviewページとなる
- もし他のviewページをメソッドの最後に明記したら、index以外のページをレンダリングすることになる。
- Rubyではメソッドの最後にreturnを明記する必要がないが、indexメソッドは最後に評価する式は
conrollerからデータをviewに渡す仕組み
- 他に定義したRubyメソッドを使ってcontrollerのインスタンス変数名と値をコピーしてviewのインスタンスに持たせること
- 普通のローカル変数だと、indexメソッド外から参照できないので、ここでインスタンス変数を使うわけ
- っていうことは、viewファイルで使っている@boardsは、実はviewクラスのインスタンスがコピした同じ名前と同じ値を持つviewのインスタンス変数?
Railsではインスタンス変数を使って、controllerからviewへのデータ共有を実現しているが、通常のOOPでのインスタンス変数の使い方とはズレているので、ちょっと議論があるけど..
他のMVCモデルを使うフレームワークはデータの共有はどうやって実現しているだろう
Railsの動きについて、いつも魔法的な感じだったけど、実は全てクラスやインスタンス、メソッドなどで実現していることは改めてわかった。
参照:
This post is licensed under CC BY 4.0 by the author.