LoginSignup
4
1

More than 1 year has passed since last update.

【Rails】params周りの理解を深める回〜"param is missing or the value is empty"へのアプローチ法〜

Last updated at Posted at 2022-11-05

Railsのparams周りのエラーについて。
とある情報を保存しようとしたときに出てしまったので残す。

エラー文

スクリーンショット 2022-11-05 13.13.16.png

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などのアクション)でしか原則適用がされないため、注意が必要である。

こちらはを公式のドキュメント参考に記述させていただいたため、こちらも一読することをおすすめしておく。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1