Rails4のストロングパラメータの設定方法についてまとめました。
(1)検証環境と検証方法
1)コントローラの設定
この設定をベースにストロングパラメータを設定し確認しています。
def search end def result @string=string_params[:string] @ary=ary_params[:ary] @hash=hash_params[:hash] end
2)動作確認
“search”ビューからクエリー文字列をURLに指定して下記URLでデータを送信します。
http://localhost:3000/users/search
“result”ビューでコントローラが受け取ったparamsの情報を表示し、正常に送受信できたか確認しています。
(2)設定方法のまとめ
1)paramsのpermitメソッドを使用
・permitメソッドで指定したキーの値のみが含まれるparamsを返す。
①文字列を送信した場合
(リクエストのクエリーパラメータ)
“/users/result?string=string”
(コントローラの設定)
@string=string_params[:string]
def string_params
params.permit(:string)
end
②配列を送信した場合
(リクエストのクエリーパラメータ)
“/users/result?ary[]=ary1&;ary[]=ary2&;ary[]=ary3”
(コントローラの設定)
@ary=ary_params[:ary]
def ary_params
params.permit(ary: [])
end
③ハッシュ
(リクエストのクエリーパラメータ)
“/users/result?hash[key1]=key1&;hash[key2]=key2&;hash[key3]=key3”
(コントローラの設定)
@hash=hash_params[:hash]
def hash_params
params.permit(hash: [:key1,:key2])
end
上記設定の場合は、hash[:key3]はストロングパラメータで許可されていないので、key1、key2を含むhashが返される。
④複数をまとめて設定
上記3つをまとめて設定した場合
@string=nest_params[:string]
@ary=nest_params[:ary]
@hash=nest_params[:hash]
def nest_params
params.permit(:string, ary: [], hash: [:key1,:key2] )
end
2)requireメソッド
・requireメソッドで指定したキーの値を返す。指定したキーの値が存在しないとエラーが発生。
例)requireメソッドを使ったリターンにpermitメソッド設定した例
requireメソッドでキーに対する値をリターンしているので、hash_params[:hash]ではなく、hash_paramsで値を取得する。
@hash=hash_params
def hash_params
params.require(:hash).permit(:key1,:key2)
end
3)fetchメソッド
・requireメソッドを使用した場合、上記2)の例の場合、params内に”hash”というキーが設定されていないリクエストが発行されると”ActionController::ParameterMissing”のエラーが発生するので注意する。
下記リクエストの場合は、クエリーストリングに”hash”が無いのでエラー終了してしまう。(上記1)の場合は問題ない)
http://localhost:3000/users/result?string=string
この場合は、fetchメソッドを使ってエラーの発生を回避する事が出来る。
fetchメソッドもrequireと同じように指定したキーの値をリターンするが、キー以外にもう一つ引数をオプションが指定出来る。この引数には、キーが存在しなかった場合にリターンする値を指定出来る。
例)ストリングパラメータに”hash”のキーが含まれない場合は、{key1:”key1″}を返す例
@hash=hash_params
def hash_params
params.fetch(:hash,{key1:”key1″}).permit(:key1,:key2)
end