是否可以生成如下选择:
sudo apt-get install python3-pygments
我尝试使用{{1}},但是我找不到将选项和组都传递给它的方法。有什么办法可以做到这一点?我也欢迎使用SimpleForm的建议。
谢谢!
答案 0 :(得分:1)
这很难在不知道数据是什么样的情况下精确地回答,但是我猜你有这样的东西:
@grouped_options = [
["Some nil value label"],
["Option one", "1"],
["Option Group 1",
[
["Option one in group 1", "1:1"],
["Option two in group 1", "1:2"],
]
],
["Option Group 2",
[
["Option one in group 2", "2:1"],
["Option two in group 2", "2:2"],
]
],
]
有了这个,您有两个选择。在普通ERB中,您可以这样操作:
<%= select "thing", "some_attr" do %>
<% @grouped_options.each do |label, value_or_options| %>
<% if Array === value_or_options %>
<%= tag.optgroup options_for_select(value_or_options), label: label %>
<% else %>
<%= tag.option label, value: value_or_options %>
<% end %>
<% end %>
<% end %>
不过,就个人而言,我会写一个助手。 Enumerable#chunk
方法将数组拆分为多个值,这些值返回给定块的相同内容,从而很容易将已分组的项目与未分组的项目分开,因此我们可以使用grouped_options_for_select
和{{1 }}:
options_for_select
然后您可以使用它:
def ungrouped_and_grouped_options_for_select(choices, selected_key = nil)
capture do
choices
.chunk {|_, choice_or_group| Array === choice_or_group }
.each do |is_group, choices_or_grouped_choices|
if is_group
concat grouped_options_for_select(choices_or_grouped_choices, selected_key)
else
concat options_for_select(choices_or_grouped_choices, selected_key)
end
end
end
end
您可以在repl.it上看到这两种方法的实际作用:https://repl.it/@jrunning/UnacceptablePlaintiveServer(请参阅<%= select "thing", "some_attr" do %>
<%= ungrouped_and_grouped_options_for_select(@grouped_options) %>
<% end %>
,views/tests/index.html.erb
和controllers/tests_controller.rb
)。