🦊

【Rails】renderメソッドの色々な使い方をざっくりまとめてみた

2021/07/17に公開

1.この記事をなぜ書いたか

renderメソッドには様々な使い方があるので、どのように使うべきか分からない時があります。そのため、renderメソッドの色々な使い方をまとめるために記事を書きました。

「そもそもrenderメソッドとredirect_toメソッドの違いが分からん!」という方や「renderメソッドの挙動が分からん!」という方は、先に以下の記事を見ることをお勧めします。
https://zenn.dev/yukihaga/articles/fda5528484865c

記事の中で間違いがある場合、コメント頂けると嬉しいです。

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.参考文献

https://pikawaka.com/rails/render
https://railsguides.jp/layouts_and_rendering.html
https://books.google.co.jp/books/about/独習Ruby_on_Rails.html?id=XNydDwAAQBAJ&redir_esc=y
https://techtechmedia.com/partial-template-rails/

Discussion