如何在 '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
我尝试过的:
我查看了此文档,但找不到我要找的内容:http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-option_groups_from_collection_for_select
我试过猜测,但这没有用:
代码:
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 } )
我想修改用户在给定集合的下拉列表中看到的内容。而不是只有 "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
我尝试过的:
我查看了此文档,但找不到我要找的内容:http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-option_groups_from_collection_for_select
我试过猜测,但这没有用:
代码:
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 } )