在 collection_select 中打印两个值(Rails 表格)

print two values in collection_select (Rails Forms)

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

<%= 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"]

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

我认为如果使用 select 而不是 collection_select 会更容易。试一试:

<%= tag_field.select :id, Material.order(:name).map{ |m| [ "#{m.name} - #{m. color}", m.id ] }, {prompt: "-select-"} %>

This answer 清楚地解释了 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

因此,如果您得到两次结果,则表示 collection/array 具有冗余值。