2013-08-26 78 views
2

我有一个视图,允许用户将list_items添加到其shopping_lists之一。我希望select的选项是它们列表的名称,但我需要将这些名称映射到各自的list_id以获得正确的关联。这是我目前的select tagRails选择选项标记 - 从关联中生成选项

<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作为该选项的值?

ShoppingList belongs_to :user 用户has_many :shopping_lists

目前我选择的标签呈现在用户的购物清单的下拉选择,但选择的形式,“#上市。点击提交按钮实际上并没有将该项目添加到列表中。

在此先感谢!

回答

3

正如你可以在Rails的API文档看:

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

options_for_select接收数组的数组。内部阵列只有两个元素:["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 %> 
+0

惊人的,谢谢!我受到你魔法的启发。 – settheline

+0

我在想一个更好的解决方案:辅助方法。看我的编辑。 – cortex