LoginSignup
0
1

More than 1 year has passed since last update.

form_withでのエラー

Posted at

遭遇したエラー

form_withを使って情報を送信しようとしたのですがその時にエラーが出て結構足止めくらいました。
スクショ忘れたのでエラー書きます。

error
  Nomethod error post_products_path  

  Did you mean? post_product_path

実際のコード

以下を見てわかる通り、post_pathなんて指定していません

 <%= form_with model: @post_product do |f| %>
   <%= f.submit "追加", class: "btn btn-outline-info" %>
   <%= f.hidden_field :title, value: product[:title] %>
   <%= f.hidden_field :image, value: product[:image] %>
   <%= f.hidden_field :product_url, value: product[:product_url] %>
<% end %>

*hidden_fieldで送っているのは、楽天apiの商品情報です。
商品情報はeachで回しているので、userがするのはsubmitボタンを押すだけでどの商品を追加するかの処理が実行されます。
hidde_fieldで送っているのはそのためです。*

もっと良い書き方できたのかもしれませんが現状これがベストでしたorz

試したこと

form_withのエラーということで、どこかに間違いがあるかな〜と見返してみたのですが、
form_withの書き方はあっているので余計にわかりませんでした。

書き方
  form_with model: modelクラスのインスタンス” do 

後はパスなんですが、railsから提案されたパスを入れても動きませんでした。

なら次はurlで指定しよう!

 form_with url: createアクションへのパス do

一応formでエラーにはならなかったのですが、今度は別のところでエラーに、

param is missing or the value is empty:

ストロングパラメーターをコントローラーで指定していたので多分それが原因になっているのかな?
前にも同じようなエラーが出たのですが、その時は

params.require(:model).permit(:カラム, ......)
↓  これを、、、、、

params.permit(:カラム, ......)
こう!

とすることで解決したのですが、どこかの記事でみたところrequireを消すのは良くないとのこと
なのでrequireを元に戻します。

formを直さないといけないので調べました。
まずmodelでインスタンスを指定するには、コントローラーでnewメソッドを使ってインスタンスを作らないといけない。
僕の場合作っていたので、他を探します。

ここで思い出したのが、最初のエラーでpathが違うと言われました。
routingをもう一度みてみると、create アクションのpathと、エラーで出てきていたpathが違ったのです。

試しにform_withの記載を

  form_with model: @model, url: createのpath

とすることで無事送信できました!

form_withが想定するpathとresoucesで作られたpathが違うのが原因みたい

formは単数系を想定して
resoucesは複数で生成されるので、urlでcreateアクションのものを使うよ~と指定してあげるのがいい!

余談

途中で下記のエラーが出ましたが、これの原因はコントローラーでモデルクラスのインスタンスを作成していないのが原因
上で書いた通りrequireを省略すれば解決するのですが、requireは省略しない方がいいと言われたので注意しましょう。

param is missing or the value is empty:
0
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
0
1