Post

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以外のページをレンダリングすることになる。
  • conrollerからデータをviewに渡す仕組み

    • 他に定義したRubyメソッドを使ってcontrollerのインスタンス変数名と値をコピーしてviewのインスタンスに持たせること
    • 普通のローカル変数だと、indexメソッド外から参照できないので、ここでインスタンス変数を使うわけ
    • っていうことは、viewファイルで使っている@boardsは、実はviewクラスのインスタンスがコピした同じ名前と同じ値を持つviewのインスタンス変数?

Railsではインスタンス変数を使って、controllerからviewへのデータ共有を実現しているが、通常のOOPでのインスタンス変数の使い方とはズレているので、ちょっと議論があるけど..

他のMVCモデルを使うフレームワークはデータの共有はどうやって実現しているだろう

Railsの動きについて、いつも魔法的な感じだったけど、実は全てクラスやインスタンス、メソッドなどで実現していることは改めてわかった。


参照:

How are Rails instance variables passed to views?

Howcome an Instance variable @variable defined in the controller’s action can be called from its views?

Sending Data Between Rails Controllers and Views

This post is licensed under CC BY 4.0 by the author.