何かと使えるようになるとめちゃ便利なrenderさん。
でもなんか書き方やどんな処理が行われているのかわからないっていう人達に向けて書いていきます。
renderってなに!
レスポンスの出力をしてくれる
renderメソッドを使うことで、ユーザーへのレスポンスとして送信すべき内容を指定することができます。
コントローラー、ビューで使う事ができます。
renderができる事
部分テンプレートを指定することができる
ファイルの名前を_tweet.html.erbなどにすることで、他のビューファイルで共通化して中身を使うことができるようになる。
これが使えるようになったらとても便利ですよね。同じコードを書かなくて済むので楽できますね。
ビューファイル内で部分テンプレートを呼び出す時
<%= render partial: ‘tweet’ %> ファイル名の_を除いた名前を使用します。
<%= render partial: ‘renderしたいファイル名’ %>
partialは部分テンプレートを明示的に指定するオプションです。
renderするメリット
部分テンプレート先で変数を使用できる
<%= render partial: ‘tweet’, locals: { tweet: @tweet } %>
のように、localsオプションを用いて、locals: { 部分テンプレート内で使いたい変数: 持っていきたい値 }
と記述します。
もしくは、<%= render tweet %>とすることでも細かいオプションをつけなくても同じ処理を行うことができます。
render時の注意点
先ほど、<%= render tweet %>とすることでも細かいオプションをつけなくても同じ処理を行うことができます。と言いましたがこの時に注意が必要です。
オプションを1つでもつけてしまうと他のオプションを正しく全て記述しなければならない必要があります。
例えば
<%= render partial: ‘tweet’ %>
この場合だとpartialオプションを記述してしまっているのでlocalsオプションを記述しないとtweetという変数を使えなくなってしまいます。
つまり、ビューファイルは共通化できるが、共通化した先で変数を使える事が出来なくなるという事。
おまけ、renderとredirect_toの違い
お互い指定しているものは同じでもそこにたどり着くまでにどんな処理をしているのかが違ってきます。
render : 表示させるviewファイルを指定
def render("user/edit") end
redirect_to : URL(HTTPリクエストメソッド)を指定
def redirect_to("/app/posts/new") end
中身の動きの違い
render : controller → view
redirect_to : controller → URL → route → controller → view
redirect_toの方が遠回りしていますね。
- renderはviewファイルを表示させる処理
- redirect_toブラウザ上でHTTPリクエストを受けたのと同じ処理
使い分け方
簡単にいうと処理の違いによって変えていく。コントローラーでの処理が必要かどうか
- データの更新/削除、inputやformなど何かデータを送る処理(POST)
- コントローラーでの処理が必要
- ログインなどの成否判断の処理
このような場合にはPOST処理が実行されるのでこのページに転移する時にredirect_toを使用する。
逆にrenderはページを転移させるだけの処理なので、コントローラーでの処理が必要ありません。
そんな感じで理解しています、メモ参考程度に。。。