LoginSignup
4
0

More than 1 year has passed since last update.

ActionController::ParameterMissing (param is missing or the value is empty: calendars): のエラー解決方法

Last updated at Posted at 2022-12-09

エラー内容

  • Railsでformを設置したが、フォームボタンを押しても反映(投稿)されない現象が発生。
  • 真っ赤の画面でもエラー画面が出てくれれば、なにが問題か調べることができるのだが、なにも反応ないというのは、駆け出しエンジニアにとっては鬼畜のエラー対応というもの!あのエラー画面のありがたさを知った機会でした。

対応した手順

  • createアクションにbinding.pryを記入してplan_paramsをチェックしてみると下記のように返ってきた。「パラメータがないか、値が空です」と言われている。
ActionController::ParameterMissing (param is missing or the value is empty: calendars):
  • Railsでは、フォームから入力された値はパラメータとして作成したビューのフォームを通し、ブラウザからサーバーに送られる。つまり、パラメーターとは、viewとcontrollerにデータを送るための箱のこと。そのパラメータがない(or値が空)なのが原因らしい。

  • さらに params 単体でみてみると、以下のように返ってきた。

=> <ActionController::Parameters {"authenticity_token"=>"cyFxZR0DT9RaBC/yhtOXM35GAIPz8ek+9q2ATgFUCs1xHwGrbsBaEVN45YcSCkTWnu5CBI4i8U5OsVVtpLvsyQ==", "plan"=>{"date"=>"2022-02-13", "plan"=>"a"}, "commit"=>"保存", "controller"=>"calendars", "action"=>"create"} permitted: false>
  • パラメーターを確認する限り、しっかり情報を渡せてるようだが、permittedがfalseになっていることが分かる
  • requireのキーにはモデル名がくるが、ここにうまくモデルを指定できていなかったことが発覚。
    • ちなみに、モデル名は、上記のparams中身の中でも、{}で囲まれているものが該当する。つまりplanのこと
  • そして、requireの中をみてみると、そこはcalendarsになっていた。オ―マイガー!
  • 本来のモデル名に修正したらparamsが正常に渡されるようになりました。
calendars_controller.rb
  private

  def plan_params
    params.require(:plan).permit(:date, :plan)
  end

結論

  • requireの中にはしっかり該当するモデル名を入れよう
  • binding.pryを使ってエラーの内容を把握しよう。今回の場合、paramsがそもそも正常に渡せていないのか、パラメーターを正常に受け取れて(保存して)いないのかが分かります。
  • エラー画面のありがたさを実感。おかしいところを勝手に教えてくれるって親切ですよね。
4
0
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
0