2

ユーザーlist_itemsが自分の の 1 つに追加できるビューがありますshopping_lists。select のオプションをリストの名前にしたいのですlist_idが、正しい関連付けを行うには、それらの名前をそれぞれにマップする必要があります。これが私の現在select tagです:

<tr>
  <% item.inventory_items.each do |product| %>
    <td>
      <%= form_tag("/list_items", method: "post") do %>
      <%= hidden_field_tag(:item_id, item.id) %>
      <%= hidden_field_tag(:inventory_item_id, product.id) %> 
      <%= select_tag(:shopping_list_id, options_for_select(current_user.shopping_lists)) %>
      <%= submit_tag("$#{product.price}", class: "btn btn-primary") %>
      <% end %>
    </td>
  <% end %>
</tr>

ユーザーの名前をオプションとして表示し、そのオプションの値としてshopping_lists相対を返すにはどうすればよいですか?shopping_list_id

ShoppingListbelongs_to :user ユーザーhas_many :shopping_lists

現在、私の選択タグはユーザーのショッピング リストのドロップダウン選択をレンダリングしますが、オプションは「#. 送信ボタンをクリックしても、実際には項目がリストに追加されません。

前もって感謝します!

4

1 に答える 1

3

Rails Api のドキュメントでわかるように:

options_for_select([["Dollar", "$"], ["Kroner", "DKK"]])
# => <option value="$">Dollar</option>
# => <option value="DKK">Kroner</option>

options_for_select配列の配列を受け取ります。内部配列は 2 つの要素のみです: ["name", "value"].

次のように、ShoppingList モデルでクラス メソッドを作成できます。

def self.options_for_list(shopping_lists)
  shopping_lists.map do |sl|
    [ sl.name, sl.id ]
  end
end

必要な配列を返します。

<%= select_tag :shopping_list_id, options_for_select(ShoppingList.options_for_list(current_user.shopping_lists)) %>

編集

または、ヘルパー メソッドを使用します。

def shopping_list_select_tag(shopping_lists, options = {})
  select_options = shopping_lists.map do |sl|
                     [ sl.name, sl.id ]
                   end
  select_tag :shopping_list_id, options_for_select(select_options), options
end

それで、

<%= shopping_list_select_tag current_user.shopping_lists %>
于 2013-08-26T23:35:53.543 に答える