🦊
【Rails】renderメソッドの色々な使い方をざっくりまとめてみた
1.この記事をなぜ書いたか
renderメソッドには様々な使い方があるので、どのように使うべきか分からない時があります。そのため、renderメソッドの色々な使い方をまとめるために記事を書きました。
「そもそもrenderメソッドとredirect_toメソッドの違いが分からん!」という方や「renderメソッドの挙動が分からん!」という方は、先に以下の記事を見ることをお勧めします。
記事の中で間違いがある場合、コメント頂けると嬉しいです。
2.renderメソッドはそもそもどこで使うのか
renderメソッドは、基本的にはコントローラやビューで使用します。
- renderメソッドをコントローラで使う
コントローラでrenderメソッドを使う理由は、コントローラのアクションに対応したビューテンプレートを呼び出すためです。呼び出したビューテンプレートに、アクション内で生成したインスタンス変数の値を利用してHTMLを作成することができます。そして、作成されたHTMLのデータをHTTPレスポンスとして、コントローラがクライアントへ転送します。renderメソッドをコントローラで使う時は、基本的にこのような使い方をします。 - renderメソッドをビューで使う
ビューでrenderメソッドを使う理由は、パーシャルテンプレートを呼び出し元のビュー内で利用したいからです。パーシャルテンプレートを呼び出す際に、インスタンス変数やurlをrenderメソッドのオプションとして設定することができます。オプションを設定することによって、インスタンス変数やurlをパーシャルテンプレートのローカル変数として使用することができます。renderメソッドをビューで使用するときは、基本的にこのような使い方をします。
3.renderメソッドの使い方(コントローラ編)
コントローラでの基本的なrenderメソッドの使い方の種類をまとめました。
- actionオプションを用いてrenderメソッドを使う
- templateオプションを用いてrenderメソッドを使う
使い方を以下で説明します。
- actionオプションを用いてrenderメソッドを使う
おそらく、一番基本的なrenderメソッドの使い方なのではと思います。actionオプションは、同じコントローラ内の他のアクションに対応したビューテンプレートを呼び出す際に使います。 この時、気をつけないといけないことは、同じコントローラ内の他のアクションに対応したビューテンプレートが呼び出されるだけで、同じコントローラ内の他のアクション自体は実行されないということです。actionオプションを用いたrenderメソッドのコードを以下に示します。
コントローラ
render action: :new
実はactionというキーは省略可能であり、以下のように書き直せます。このような書き方がRails界隈では主流なのかなと思います。
コントローラ
render :new
- templateオプションを用いてrenderメソッドを使う
templateオプションは、異なるコントローラ内のアクションに対応したビューテンプレートを呼び出す際に使います。 actionオプションでは同一コントローラのみでしたが、templateオプションを用いると、異なるコントローラも指定できます。その点がactionオプションとtemplateオプションの大きな違いだと思います。templateオプションを用いたrenderメソッドのコードを以下に示します。
コントローラ
render template: 'boards/new'
実はactionオプション同様、templateというキーは省略可能です。そのため、以下のように書き直せます。
コントローラ
render 'boards/new'
4.renderメソッドの使い方(ビュー編)
ビューでの基本的なrenderメソッドの使い方の種類をまとめました。
- 単数形のインスタンス変数とpartialオプションを用いて、renderメソッドを使う
- 複数形のインスタンス変数とpartialオプションを用いて、renderメソッドを使う
使い方を以下で説明します。
- 単数形のインスタンス変数とpartialオプションを用いて、renderメソッドを使う
基本的には、以下のコードのように使います。partialオプションのバリューに呼び出したいパーシャルテンプレートの名前を指定します。そして、そのパーシャルテンプレート内のローカル変数として使いたいインスタンス変数を、localsオプションのバリューにハッシュで指定します。(以下のコードの場合、呼び出したいパーシャルテンプレートの名前はboard_formであり、そのパーシャルテンプレート内のローカル変数の値として@boardとboard_path(@board)を使います。)
ビュー
<%= render partial: 'board_form', locals: { board: @board, url: board_path(@board) } %>
実はpartialというキーとlocalsというキーは省略可能なので、以下のように簡略化して書けます。
ビュー
<%= render 'board_form', { board: @board, url: board_path(@board) } %>
- 複数形のインスタンス変数とpartialオプションを用いて、renderメソッドを使う
基本的には、以下のコードのように使います。複数形のインスタンス変数を用いる場合、localsオプションではなくcollectionオプションを使います。collectionオプションを使用すると、バリューに設定した複数形インスタンス変数の要素の分だけ部分テンプレートが繰り返し表示されます。ここで気をつけたいのは、部分テンプレートの読み込み自体は1回だけであるということです。そのため、each文で部分テンプレートを繰り返し読み込むよりパフォーマンスが良いです。
ビュー
<%= render partial: "boards/board", collection: @bookmark_boards %>
実は、取得したいパーシャルテンプレートの名前と複数形インスタンス変数の名前(sを除く)が一致していると、afterのコードのようにかなり簡略化できます。
- before
ビュー
<%= render partial: "board", collection: @boards %>
- after
<%= render @boards %>
5.終わり
renderメソッドの色々な使い方についてまとめてみました。この記事が少しでも多くの人の役に立てば幸いです!
6.参考文献
Discussion