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メソッドで指定してあげる必要があります。
#####・特定のアクションに対応するビューを表示させる時
def index
render action: :new
end
とすると同じコントローラー内のnewアクションに対応するviewファイル(views/tweets/new.html.erb)を表示させます。
#####・違うコントローラー内のアクションに対応するビューを表示させる時
def index
render template: "review/new"
end
とすると違うコントローラー内のアクションも呼び出すことができます。
上の例ではreviewsコントローラーのnewアクションに対応するビューファイル(views/reviews/new.html.erb)を呼び出しています。
#####・jsonを返す時
以下のように、コントローラーのアクション内でrender json: @tweets
とすると、そのアクションが呼び出された際に、@tweetsの値をjson形式で出力してくれます。
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
#####・文字列を返す時
以下のようにコントローラーのアクション内でrender text: "文字列"
とすると、そのアクションが呼び出された際に指定した文字列を出力してくれます。
class TweetsController < ApplicationController
def index
render text: "mojiretsu"
end
end
#####・XMLを返す時
以下のようにコントローラーのアクション内でrender xml: @tweets
とすると、そのアクションが呼び出された際にxml形式で@tweetsの値を出力してくれます。
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