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

Rails5.1のリクエスト・レスポンス処理まとめ

More than 3 years have passed since last update.

前書き

redirect_to :backがRails5.1で使えなくなっていたので、
Rails5.1のリクエスト・レスポンス処理を整頓しました。

リクエスト

paramsメソッド

  • リクエスト情報を取得する
  • paramsで取得できるリクエスト情報
    • ポストデータ(form)
    • クエリ情報(URLの末尾の?以降)
    • ルートパラメータ(ルートで定義されたパラメータ(books/1の1))
  • 配列やハッシュも受け取り可能
render plain: params[:id]

マスアサインメント脆弱性を回避する --StrongParams

  • ActiveRecord元々の機能
  • new/update_attributesなどのマスアサインメント系のいたずら防止の為に行う。
  • StrongParamsはホワイトリスト対策で、予め設定可能な値を明示的に宣言しておく。
params.require(model).permit(attr, attr...)

request.headersメソッド

  • リクエストのヘッダー情報を取得できる
  • ヘッダー情報以外にもサーバー環境変数なども含まれる
    • 使用している環境によって変化することがある
request.headers[XXXX]
  • Accept
    • クライアントがサポートしているコンテンツの種類
  • Accept-Language
    • クライアントの対応言語
  • Authorization
    • 認証情報
  • Host
    • 要求先のホスト名
  • Referer
    • リンク元のURL
  • User-Agent
    • クライアントの種類

requestオブジェクトの他のメソッド

  • accepts
  • authorization
  • body
  • fullpath
  • get?
  • host
  • host_with_port
  • local?
  • method
  • port
  • port_string
  • protocol
  • remote_ip
  • request_method
  • scheme
  • server_software
  • ssl?
  • standard_port?
  • url
  • xml_http_request?

レスポンス

メソッド 概要
render テンプレートの呼び出し・テキスト/スクリプトの出力など、汎用的な結果出力手段
redirect_to 指定されたアドレスに処理をリダイレクト
send_file 指定されたファイルを出力
sen_data 指定されたバイナリデータを出力
head 応答ヘッダーのみを出力
respond_to ファイルフォーマットに応じてマルチフォーマットに対応してレスポンス

renderメソッド

テンプレート呼び出し系

アクション名と異なるテンプレートファイルを呼び出す

render action: 'index'

異なるコントローラのテンプレートを呼び出す

render template: 'hello/view'

アプリ外のテンプレートを呼び出す

render file: '/data/template/list'
  • action, template, fileは省略可能
render 'index'
render 'hello/view'
render '/data/template/list'

コンテンツ出力系

  • renderはテンプレートファイルを呼び出すだけではない
  • MVCの考え方には反するが使える

plain

指定された文字列をそのまま出力する

render plain: [text]

html

text/html形式の文字列を出力する

render html: '<div style="color:red;">hello</div>'

inline

指定された文字列をERBテンプレートと解釈して結果を出力する

render inline: <%= @books %>

json

json形式で結果を出力する
レスポンスヘッダーにapplication/jsonも付与してくれる。

render json: @todos

### その他オプション

#### content_typeオプション

以下の様にcontent_typeをオプションで指定可能

```rb
render plain: 'hello', content_type: 'text/comma-separated-values'

statusオプション

ステータスコードを指定可能

render json: todos, status: 200

二重レンダリングに注意

renderは途中で処理が抜けない為、もしif文などの途中でrenderするなら明示的にreturnする必要がある。

headメソッド

コンテンツ本体だけではなく、ただステータスコードのみを返したいケースに利用

head 404

シンボルでも指定可能

head :ok # 200
head :not_found # 404
head :forbidden # 403

redirect_toメソッド

指定されたページ(URL)にリダイレクト(移動)する

redirect_to /todos

様々な指定方法がある

redirect_to 'http://todos/show'
redierct_to action: :show
redirect_to controller: :todos, action: :show
redirect_to todos_show_path

redirect_backメソッド

1つ前のページにリダイレクトするメソッド
Rails4系まではredirect_to :backを使っていた。

redirect_back fallback_location: <URL>

直前のURLが見つからない場合は<URL>に遷移する

まとめ

redirect_back以外はRails4とあまり変わってなかった。
RailsをAPIサーバとして作る時に、JBuilderを使うか悩んだが、
RailsAPIモードでもJSONを返す時はrenderで返していたので、
renderで単純にレスポンスしてあげるのがベストかと思いました。

別件ですが、webpackerを使ってReact+Railsパターンが簡単にビルドできので、
次はその記事を書こう思います。

tfrcm
React / ReactNative / Go / TypeScript / AWS / Docker / k8s
https://gemcook.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
ユーザーは見つかりませんでした