Railsのparams周りのエラーについて。
とある情報を保存しようとしたときに出てしまったので残す。
エラー文
paramsが存在していない、または空であるという意味らしい。
問題となっているファイルのコード
memory_submits_controller.rb
class MemorySubmitsController < ApplicationController
def index
@memorys = MemorySubmit.all
end
def new
@memory = MemorySubmit.new
end
def create
memory = MemorySubmit.new(memory_params)
if memory.save
redirect_to :action => "index"
else
redirect_to :action => "new"
end
end
private
def memory_params
params.require(:memory).permit(:body)
end
end
出力は以下の通りである。ちゃんと情報は渡せてるように思うが、、、
Parameters: {"authenticity_token"=>"[FILTERED]", "memory_submit"=>{"body"=>"aaa"}, "commit"=>"投稿する"}
エラー解決方法
params.require(:memory)をparams.require(:memory_submit) に変更して解決した。 以下が修正後のコードである。
memory_submits_controller.rb
private
def memory_params
params.require(:memory_submit).permit(:body)
end
end
requireの中にはモデル名を記述してあげることで解決することができた。
ストロングパラメータ
ストロングパラメータとはWeb上で受けたパラメータが、安全であるかどうか確認をおこなった上で、取得することができる仕組み
のことである。 この仕組みを導入したことによって、意図していない、つまり安全であるかどうかわからないデータの保存や更新を未然に防ぐことができるようになった。 情報セキュリティの観点からしてみれば非常に優れた仕組みであることがわかる。
基本的な書き方
requireメソッド
paramsの中にある特定のキーに紐づいている値を抽出することができるものである。(ここではカラムに紐づいているモデルという解釈で大丈夫であろう。)
permitメソッド
許可された値だけを取得することができるメソッドであり、引数には登録を許可するカラム名全てを指定しておくことが非常に重要である。(記述していないカラムは取得されずに無視されるようになっています) params.require(:memory_submit).permit(:body)
カラムを追加しておこなう場合は追加して記述する必要がある。
例)imageカラムを追加した場合
params.require(:memory_submit).permit(:body,:image)
適用対象
このストロングパラメータの仕組みは全てに適用されるわけではない。Viewから送信されるようなデータ(コントローラーに記述しているparams)やそれに対するメソッド(createやupdateなどのアクション)でしか原則適用がされないため、注意が必要である。こちらはを公式のドキュメント参考に記述させていただいたため、こちらも一読することをおすすめしておく。