🐟
[Rails]respond_toメソッドでリクエストフォーマットによってレンダリングを変える
コンテンツのフォーマットによって表示を出し分け
RailsではHTMLだけでなく、JSONやXMLなどその他のフォーマットで表示させることもできます。
同じアクション内部でビューの出し分けをするための方法を見ていきます。
respond_toメソッド
リクエストの形式(HTMLやJSONなど)によって処理・レンダリングを変えるにはrespond_to
メソッドを使います。
app/controllers/books_controller.rb
class BooksController < ApplicationController
def show
@book = Book.find(params[:id])
# リクエスト時のフォーマットによって対応するレスポンスをコントローラで制御している
respond_to do |format|
# htmlでリクエストされたときshow.html.erbをレンダリング。ブロックは省略可
format.html { render :show, format: :html }
# jsonでリクエストされたとき(render :show, format: :json)と同義
# ブロックで渡さなくても、レンダリングできるが明示的にすることで柔軟に変更できる
format.json { render json: @book }
end
end
end
ポイント
- 処理を
respond_to do |format| 〜 end
のブロックで囲います。 -
format.html { render :show, format: :html }
でHTMLテンプレートでshowアクションのテンプレートを参照します。(show.html.erb) -
format.json { render json: @book }
で同じくshow.json.erbのように規約に合致するテンプレートを参照します。 - 例えば「/books/1.json」というパスでアクセスされた場合は、jsonフォーマットのレスポンスを要求していると解釈できる。
- つまり、リクエスト時のフォーマットによって対応するレスポンスをコントローラで制御しています。
render処理ではなくリダイレクトしたい場合
また、renderによる描画ではなく、リダイレクト処理をしたい場合もあると思います。
そんなときは、例えば下記のように処理を書くことができます。
class BooksController < ApplicationController
def show
@book = Book.find(params[:id])
# リクエスト時のフォーマットによって対応するレスポンスをコントローラで制御している
respond_to do |format|
# htmlでリクエストされたとき(render :show, format :html)と同義
format.html { redirect_to profile_path }
# jsonでリクエストされたとき(render :show, format :json)と同義
# ブロックで渡さなくても、レンダリングできるが明示的にすることで柔軟に変更できる
format.json { render json: @book }
end
end
ステータスコードを返す
headメソッドでステータスコードのシンボルを渡せます。
def destroy
@book.destroy
respond_to do |format|
format.html { redirect_to "/" }
# :no_contentというシンボルを指定すると204のステータスコードを返す(redirection)
format.json { head :no_content }
end
end
コード番号 | シンボル |
---|---|
200 | :ok |
201 | :created |
202 | :accepted |
204 | :no_content |
304 | :not_modified |
400 | :bad_request |
401 | :unauthorized |
403 | :forbidden |
404 | :not_found |
409 | :conflict |
422 | :unprocessable_entity |
Discussion