はじめに
プログラミング初学者のため、自分の理解できている範囲内で言語化しています。
何か間違っている情報や改善点などありましたら、コメントいただけますと幸いです。🙇♂️
何が起きたのか
<%= form_with model: @information, class: 'form' do |f| %>
簡単なお問い合わせ機能を作成しようとしたときに、
form_withの**model:**でモデルのインスタンスを指定したら、
pathが違うというエラーが出たので、**url:**で指定したら、成功した。
が、、、データベースに情報を保存したかったため、**model:**でどうしてもやりたかったが
エラーがなかなか倒せなかったので、調べようと思った😭
このエラーのよくある原因
1.『@モデル名』 の部分が記述ミス
2. コントローラーでインスタンス変数がうまく設定できていない
3. モデル自体を複数形で作ってしまっている
まずはそこをチェック。**
それ以外の人はこの方法で行けるかも🏄♂️
最終的な解決策
**url:**も指定して、正しいpathを記述する
<%= form_with model: @information, url: informations_path, class: 'form' do |f| %>
**model:**を使うと、作ってもいないpathを使おうとしていたので、url:も指定して解決することができた。
モデルだけ指定して、変なpathや、うまくいかない人はこれを試すと良い
ちなみにモデルの名前を複数形にしたりすると、このようなエラーになるみたい、、、
私はいろんなとこを確認しても、原因がわからなかったので力技みたいですがこれで解決
url: model: の違い
大まかな違いは、データベースに情報を保存するかしないかである
保存する → model:
保存しない → url:
を使う。
これによってコントローラーのストロングパラメーターの記述も変わる
url: → params.permit(:name, :email)
model: → params.require(:user).permit(:name, :email)
まとめ
今回は、エラーの原因がわからなかったが、とりあえず完成を優先したかったので解決してよしとしたが、原因を知らないのは悔しい、、、
また、仮に**url:**のままでお問い合わせ機能を作ったとして、うまく投稿できなかったときのバリデーションのエラーメッセージの表示はどうするのか気になった。
本来であれば、if model.errors.any? を使うから、modelの部分はどうなる?
疑問がさらに疑問を産んだため、いったんここで打ち切り😭
また次の機会で投稿してみようと思う腕