Help us understand the problem. What is going on with this article?

忘れがちなrenderメソッドの使い方まとめ [Rails]

More than 1 year has passed since last update.

renderメソッドの使い方について曖昧だったので調べてまとめてみました。
間違い等ありましたら指摘していただけるとありがたいです。

renderメソッドとは?

renderメソッドとはレスポンスの出力をしてくれるメソッドです。
renderメソッドを使うことで、ユーザーへのレスポンスとして送信すべき内容を指定することができます。
コントローラー、ビューで使う事ができます。

renderメソッドをビューで使う

renderメソッドを使うと、部分テンプレートを指定することができます。
部分テンプレートを使えば、同じHTML構造の部分を共通化することができます。共通化することで、繰り返し書くコードを1回で済ませる・修正するとき修正箇所が少なくて済む、などのメリットがあります。

・部分テンプレートの名前

_tweet.html.erbのように必ず_から始めます。

・ビューファイル内で部分テンプレートを呼び出す時

<%= render partial: ‘tweet’ %>のように、_と拡張子除いた形で呼び出します。
partialは部分テンプレートを明示的に指定するオプションです。

・部分テンプレート内で変数を使いたい時

<%= render partial: ‘tweet’, locals: { tweet: @tweet } %>
のように、localsオプションを用いて、
locals: { 部分テンプレート内で使いたい変数: 持っていきたい値 }
と記述します。

・部分テンプレート内で繰り返し処理を行いたい時

<%= render partial: ‘tweet’, collection: @tweets %>
とcollectionオプションに@tweetsと複数形の変数渡すと、部分テンプレートでtweetが個別のインスタンスとして呼ばれる変数となり、さらにeach文を使用せずに繰り返し処理も行ってくれます。
<%= render @tweets %>
と略して書くことも可能です。

renderメソッドをコントローラーで使う

railsではコントローラー名とメソッド名からrenderメソッドを記載しなくても自動的にレンダリングするビューを特定してくれます。
デフォルトでは、”app/views/コントローラー名/メソッド名.html.erb”という名前のファイルを呼び出します。
それ以外のビューファイルや形式を出力したい際はrenderメソッドで指定してあげる必要があります。

・特定のアクションに対応するビューを表示させる時
tweets_controller.rb
def index
  render action: :new
end

とすると同じコントローラー内のnewアクションに対応するviewファイル(views/tweets/new.html.erb)を表示させます。

・違うコントローラー内のアクションに対応するビューを表示させる時
tweets_controller.rb
def index
  render template: "review/new"
end

とすると違うコントローラー内のアクションも呼び出すことができます。
上の例ではreviewsコントローラーのnewアクションに対応するビューファイル(views/reviews/new.html.erb)を呼び出しています。

・jsonを返す時

以下のように、コントローラーのアクション内でrender json: @tweetsとすると、そのアクションが呼び出された際に、@tweetsの値をjson形式で出力してくれます。

tweets_controller.rb
class TweetsController < ApplicationController

  def index
    @tweets = Tweet.includes(:user).order("created_at DESC").page(params[:page]).per(5).order("created_at DESC")
    render json: @tweets
  end
end

localhost_3000-1.png

・文字列を返す時

以下のようにコントローラーのアクション内でrender text: "文字列"とすると、そのアクションが呼び出された際に指定した文字列を出力してくれます。

tweets.controller.rb
class TweetsController < ApplicationController

  def index
    render text: "mojiretsu"
  end
end

localhost_3000_と_pictweet4_—_ruby_bin_rails_s_—_80×24.png

・XMLを返す時

以下のようにコントローラーのアクション内でrender xml: @tweetsとすると、そのアクションが呼び出された際にxml形式で@tweetsの値を出力してくれます。

tweets_controller.rb
class TweetsController < ApplicationController

  def index
    @tweets = Tweet.includes(:user).order("created_at DESC").page(params[:page]).per(5).order("created_at DESC")
    render xml: @tweets
  end
end

localhost_3000.png

a10lab
三日坊主防止アプリ「みんチャレ」の運用会社エーテンラボ株式会社です
https://a10lab.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした