Step by Step Ruby on Rails

Ruby on Railsで実際にWebサイトを構築する手順をまとめています。

Rails4のストロングパラメータの設定方法

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