4.2 レスポンス
フォーマットを設定する
コントローラで出力するフォーマットを決めるにはrespond_to
メソッドを使います。
class PostsController < ApplicationController
def index
@posts = Post.all
respond_to do |format|
format.html
format.xml { render xml: @posts }
format.json { render json: @posts }
end
end
end
フォーマットとして指定できる形式は以下になります。
フォーマット | |
---|---|
html | HTML |
xml | XML |
json | JSON |
rss | RSS |
atom | ATOM |
yaml | YAML |
text | TEXT |
js | JavaScript |
css | CSS |
cvs | CVS |
ics | ICS |
文字列を表示する
文字列を表示するにはrender
メソッドにplain
というキーと描画したい文字列のハッシュを指定します。
class PostsController < ApplicationController
def text
render plain: 'このテキストは描画されます。'
end
end
JSONを表示する
JSONを表示するにはrender
メソッドにjson
というキーと描画したいオブジェクトのハッシュを指定します。
class PostsController < ApplicationController
def show
@post = Post.find(1)
render json: @post
end
end
XMLを表示する
XMLを表示するにはrender
メソッドにxml
というキーと描画したいオブジェクトのハッシュを指定します。
class PostsController < ApplicationController
def show
@post = Post.find(1)
render xml: @post
end
end
ステータスコードを設定する
ステータスコードを指定するときはhead
メソッドを使います。
class PostsController < ApplicationController
def show
@post = Post.find(1)
unless @post
head :not_found
end
end
end
100番台
番号 | シンボル |
---|---|
100 | :continue |
101 | :switching_protocols |
102 | :processing |
200番台
番号 | シンボル |
---|---|
200 | :ok |
201 | :created |
202 | :accepted |
203 | :non_authoritative_information |
204 | :no_content |
205 | :reset_content |
206 | :partial_content |
207 | :multi_status |
208 | :already_reported |
226 | :im_used |
300番台
番号 | シンボル |
---|---|
300 | :multiple_choices |
301 | :moved_permanently |
302 | :found |
303 | :see_other |
304 | :not_modified |
305 | :use_proxy |
306 | :reserved |
307 | :temporary_redirect |
308 | :permanent_redirect |
400番台
番号 | シンボル |
---|---|
400 | :bad_request |
401 | :unauthorized |
402 | :payment_required |
403 | :forbidden |
404 | :not_found |
405 | :method_not_allowed |
406 | :not_acceptable |
407 | :proxy_authentication_required |
408 | :request_timeout |
409 | :conflict |
410 | :gone |
411 | :length_required |
412 | :precondition_failed |
413 | :request_entity_too_large |
414 | :request_uri_too_long |
415 | :unsupported_media_type |
416 | :requested_range_not_satisfiable |
417 | :expectation_failed |
422 | :unprocessable_entity |
423 | :locked |
424 | :failed_dependency |
426 | :upgrade_required |
428 | :precondition_required |
429 | :too_many_requests |
431 | :request_header_fields_too_large |
500番台
番号 | シンボル |
---|---|
500 | :internal_server_error |
501 | :not_implemented |
502 | :bad_gateway |
503 | :service_unavailable |
504 | :gateway_timeout |
505 | :http_version_not_supported |
506 | :variant_also_negotiates |
507 | :insufficient_storage |
508 | :loop_detected |
510 | :not_extended |
511 | :network_authentication_required |
使用するレイアウトを設定する
layout
メソッドを使うと使用するレイアウトを指定することができます。
指定しない場合はapp/views/layouts/application.html.erb
がレイアウトとして利用されます。
class PostsController < ApplicationController
layout 'admin' # adminという管理画面用のレイアウトを指定
def show
@post = Post.find(1)
end
end
使用するテンプレートを設定する
デフォルトではrender
メソッドを省略するとアクションの名前のテンプレートが呼ばれます。
render
メソッドを利用することで使用したいテンプレートを変更することができます。
他のアクションのテンプレートを呼び出す
class PostsController < ApplicationController
def create
@post = Post.create
render :show # showアクションのテンプレートを呼び出す
end
end
パスを指定してテンプレートを呼び出す
class PostsController < ApplicationController
def create
@post = Post.create
render 'admin/posts/show' # テンプレートのパスを指定
end
end
フラッシュメッセージを表示する
フラッシュメッセージは簡易的なメッセージを表示することができる機能です。
リクエストごとにクリアされるflash
というハッシュに格納したテキストを利用することができます。
格納時にキーを指定することができます。
メッセージの格納
flash[:notice] = '注意!'
格納したメッセージの削除
flash.discard(:notice)
ビューで表示する
<div class="alert">
<%= flash[:notice] %>
</div>
ファイルをダウンロードできるようにする
ファイルをダウンロードさせるにはsend_file
メソッドを使います。
class PostsController < ApplicationController
# ディスク上に生成・保存済みのファイルを送信する
def download_report
post = Post.find(params[:id])
send_file(
"#{Rails.root}/files/post/#{post.id}.pdf", # ファイルのパス
filename: "#{post.title}.pdf", # 出力するファイル名
type: "application/pdf" # Content-Type
)
end
end