0

对于我的表格,我有这个:

<%= tag_field.collection_select( :id, Material.order(:name), :id, :name,
      :prompt => "-select-")%>

这会打印我的材料名称。例子:

Cat 
Cat

但是,这无济于事,因为材料具有相同的名称。Material 记录中还有另一个属性:color。

我希望它在下拉列表中打印出来

Cat - Brown
Cat - Orange

我该怎么做呢?我尝试调用一个方法,但它并没有按照我想要的方式打印出来。这就是我所做的。

View:     
<%= tag_field.collection_select( :id, Material.order(:name), :id, :something,
      :prompt => "-select-")%>

Model:
def something
    materials_array = []
    Material.all.each do |material|
      if material.color == nil
        material.name + '-' + material.size
      else
        materials_array.push(material.name + '-' + material.color)
      end
    end
    materials_array
  end

但是,下拉列表打印出来是这样的:

["Cat - Brown", "Cat - Orange"]
["Cat - Brown", "Cat - Orange"]

它打印了两次,具有相同的值。我想我很接近?请帮忙。

4

2 回答 2

0

我认为如果您使用select而不是collection_select. 尝试一下:

<%= tag_field.select :id, Material.order(:name).map{ |m| [ "#{m.name} - #{m. color}", m.id ] }, {prompt: "-select-"} %>
于 2016-07-31T16:21:26.683 回答
0

这个答案清楚地解释了collection_select助手的用法。该方法:name_with_initial(对应something于您的代码中的方法)解释为:

:name_with_initial, # this is name of method that will be called for
# every row, result will be set as value
 
# as a result, every option will be generated by the following rule: 
# <option value=#{author.id}>#{author.name_with_initial}</option>
# 'author' is an element in the collection or array

因此,如果您获得两次结果,则意味着集合/数组具有冗余值。

于 2016-07-31T17:39:02.207 回答