如何在'options_from_collection_for_select'方法中创建自定义标签?

时间:2015-03-17 13:55:40

标签: ruby-on-rails ruby view

我想修改用户在给定集合的下拉列表中看到的内容。而不仅仅是“产品”字段可见,我希望它像“Vender产品,版本”或类似的东西。

可以使用'options_from_collection_for_select'方法完成吗?

我有一个Ruby on Rails视图,其中包含此行(slim):

select.form-control#external_tool_question_external_tool name="external_tool_question[external_tool]"    
    = options_from_collection_for_select(@external_tools, :id, "product")

控制器:

@external_tools = ExternalTool.all

模型(通过一些不同的迁移):

t.string :value
t.string :validator
t.string :example_answer
t.boolean :required, :null => false, :default => true
t.boolean :is_file_upload, :null => false, :default => false

add_reference :external_tool_questions, :external_tool, index: true

我尝试了什么:

代码:

options_from_collection_for_select(@external_tools, "id", "product vendor")

(也......我无法弄清楚如何让select标签工作......我也使用简单的形式......不是真正紧迫的问题,只是一个侧面问题)

3 个答案:

答案 0 :(得分:2)

您可以更改ExternalTool,如下所示:

class ExternalTool
  def label
    "#{vendor} #{product} v #{version}"
  end
end

在控制器中设置变量时:

class SomeController < ApplicationController
  def form_action
    @external_tools = ExternalTool.all
  end
end

您可以在模板中使用它,如下所示:

options_from_collection_for_select(@external_tools, "id", "label")

请注意,他的第三个参数中的options_from_collection_for_select接受要调用的名称。我们在label中使用了ExternalTool

希望有所帮助!祝你好运!

答案 1 :(得分:0)

我找到了一个解决方案,但确实发生了很大变化。而不是使用&#39; options_from_collection_for_select&#39;方法,使用&#39; options_for_select&#39;方法:

控制器

tools = ExternalTool.all.pluck(:id, :vendor, :product, :version)
@external_tools = []
tools.each do |et|
  @external_tools.push(["#{et[1]} #{et[2]}, v #{et[3]}", et[0] ])
end

查看

select.form-control#external_tool_question_external_tool name="external_tool_question[external_tool]"
  = options_for_select(@external_tools)

我想我也可以在模型中创建一个方法。

答案 2 :(得分:0)

您可以将Proc传递给 options_from_collection_for_select text_method

e.g。

group values by price_value into g