Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ruby on rails プルダウンの保存の仕方

Q&A

解決したいこと

プルダウンした内容を保存したい

Ruby on RailsでWebアプリをつくっています。
他のテーブルの情報をプルダウンで表しましたが、その情報を選択しても保存ができません。
解決方法を教えて下さい。

該当するソースコード

app/views/wants/new.html.erb

              <% Supermarket.all.each do |supermarket| %>
                <% if current_user == supermarket.user %> 
                  <select name="want[supermarket_id][]">
                    <option value="">Supermarket to buy the food</option>
                    <option value=<%= supermarket.id %>><%= supermarket.market %></option>
                  </select>
                  <div class="attention">
                    ❗️ First, register the supermarket and then select ❗️
                  </div>
                <% end%>
              <% end %>

db/migrate/.....wants.erb

         t.string :wanted, null: false
      t.text :account
      t.integer :categori_id, null: false
      t.references :user, null: false, foreign_key: true
      t.references :supermarket, null: false, foreign_key: true

自分で試したこと

インターネットで調べて、プルダウンで選択したスーパーの情報をparamsで保存できるようコードを書いた。しかし一向に解決できなかった。db/migrate/.....wants.erbのコードより、supermarket_idを保存したいが、その方法がわからない。教えてください🙏🏻

0

2Answer

こんにちは
supermarket_idの保存ができないとのことでコントローラの処理なども気になるところですが、現状の情報で考えられるとしたら以下かなと思います。

<select name="want[supermarket_id][]">
   <option value="">Supermarket to buy the food</option>
   <option value=<%= supermarket.id %>><%= supermarket.market %></option>
</select>

<select name="want[supermarket_id][]">となっているので、コントローラ側へはsupermarket_idが配列で送られているかと思います。.....wants.erbを見るとsupermarket_idはbigint型(referencesのデフォルト型はbigint)となっているので型が不一致により保存できていない。

↓提案
①supermarket_idが複数選択の想定ではない場合、
<select name="want[supermarket_id][]"><select name="want[supermarket_id]">と変更するとうまく保存されるかもしれません。

②wantsの1レコードに複数のsupermarket_idを配列で持たせる場合、
記事にされている方がいらっしゃいましたので、以下記事などを参考にテーブル定義の見直しをするとよいかと。
https://qiita.com/keiy121/items/311de76e1127b1643501

プルダウンで選択したスーパーの情報をparamsで保存できるようコードを書いた

とあるため、supermarket_id以外は保存できている(supermarket_idのみnilになるのかな)と思っています。

ざっくりですが、以下の点を見直してみるとよいかもしれません。
①パラメータが意図した処理に送られているか
②送られたパラメータの中身が想定している形で送られているか
③送られたパラメータをきちんと処理できているか

検討違いの回答かもしれませんが、参考になると幸いです。

1Like

Comments

  1. @mina121

    Questioner

    @yoshi-samuraiさんにご指摘していただいたように、型が不一致により保存されていませんでした。

    supermarket_idが複数選択の想定ではない上に配列で保存しないのに、<select name="want[supermarket_id][]">と記述していたため保存できなかったのと、
    コントローラーでも配列で保存(params.require(:want).permit(supermarket_ids: []と記述していた)しようとしていてカラムの指定と反していたため?保存できなかったと考えました。そのため、配列で保存する記述を所々直したところ、うまく保存できるようになりました。
    エラーの原因をもう少し深く考えて次に進みます。ありがとうございました!

要はここでSupermarket to buy the foodとデフォルトで表示されるのではなく、<%= supermarket.market %>の方を表示させたい?

<select name="want[supermarket_id][]">
  <option value="">Supermarket to buy the food</option>
  <option value=<%= supermarket.id %>><%= supermarket.market %></option>
</select>

要素に selected 属性を付けることで、ページが最初に読み込まれたときに既定で選択状態にすることができます。

Railsなんでformはこういうので組み立てるほうが楽かも。

0Like

Your answer might help someone💌