0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

form_with使用の際model:を使ったときにエラーになった話

Last updated at Posted at 2021-04-29

はじめに

プログラミング初学者のため、自分の理解できている範囲内で言語化しています。
何か間違っている情報や改善点などありましたら、コメントいただけますと幸いです。🙇‍♂️

何が起きたのか

html.erb
<%= form_with model: @information, class: 'form' do |f| %>

簡単なお問い合わせ機能を作成しようとしたときに、
form_withの**model:**でモデルのインスタンスを指定したら、
pathが違うというエラーが出たので、**url:**で指定したら、成功した。
が、、、データベースに情報を保存したかったため、**model:**でどうしてもやりたかったが
エラーがなかなか倒せなかったので、調べようと思った😭

このエラーのよくある原因

1.『@モデル名』 の部分が記述ミス
2. コントローラーでインスタンス変数がうまく設定できていない
3. モデル自体を複数形で作ってしまっている
まずはそこをチェック。**

それ以外の人はこの方法で行けるかも🏄‍♂️

最終的な解決策

**url:**も指定して、正しいpathを記述する

html.erb
<%= 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の部分はどうなる?
疑問がさらに疑問を産んだため、いったんここで打ち切り😭
また次の機会で投稿してみようと思う腕

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?