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

How to create custom label in 'options_from_collection_for_select' method?

我想修改用户在给定集合的下拉列表中看到的内容。而不是只有 "product" 字段可见,我希望它像 "Vender Product, version" 或类似的东西。

这可以用'options_from_collection_for_select'方法来完成吗?

我在 Rails 视图上有一个 Ruby 视图,其中包含以下行(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 标签起作用……我也在使用简单的形式……不是真正紧迫的问题,只是附带问题)

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

控制器

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)

我想我也可以在模型中创建一个方法来执行此操作。

您可以像下面这样更改您的 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 在他的第三个参数中接受了要调用的名称。这里我们在 ExternalTool.

中使用 label

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

您可以将 Proc 传递给 options_from_collection_for_select 作为 text_method.

例如

options_from_collection_for_select(@external_tools, "id", 
  proc{ |external_tool| external_tool.product + external_tool.vendor } )