Rails生成带有选项和选项组的select

时间:2019-06-11 13:17:40

标签: ruby-on-rails ruby ruby-on-rails-5 simple-form

是否可以生成如下选择:

sudo apt-get install python3-pygments

我尝试使用{{1}},但是我找不到将选项和组都传递给它的方法。有什么办法可以做到这一点?我也欢迎使用SimpleForm的建议。

谢谢!

1 个答案:

答案 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.erbcontrollers/tests_controller.rb)。