エラー内容
- 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がそもそも正常に渡せていないのか、パラメーターを正常に受け取れて(保存して)いないのかが分かります。
- エラー画面のありがたさを実感。おかしいところを勝手に教えてくれるって親切ですよね。