遭遇したエラー
form_withを使って情報を送信しようとしたのですがその時にエラーが出て結構足止めくらいました。 スクショ忘れたのでエラー書きます。 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: