前書き
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パターンが簡単にビルドできので、
次はその記事を書こう思います。