Ruby on rails 如何使用简单表单创建分组选择框?

Ruby on rails 如何使用简单表单创建分组选择框?,ruby-on-rails,forms,select,simple-form,Ruby On Rails,Forms,Select,Simple Form,我使用simple_form gem创建Rails表单。 除了如何创建分组选择框之外,其他都很好?在文档中或google ing中找不到它。我发现创建分组选择框的唯一合理方法是使用select帮助器传入一个,它确实为choices参数选择了一个select_键参数(因此,您可以确保在模型中设置的参数实际被选中)。您将看到下面的完整通话。对不起,如果它让人困惑的话 -# @answer is the model instance passed into simple_form_for/form_

我使用simple_form gem创建Rails表单。


除了如何创建分组选择框之外,其他都很好?在文档中或google ing中找不到它。

我发现创建分组选择框的唯一合理方法是使用select帮助器传入一个,它确实为choices参数选择了一个select_键参数(因此,您可以确保在模型中设置的参数实际被选中)。您将看到下面的完整通话。对不起,如果它让人困惑的话

-# @answer is the model instance passed into simple_form_for/form_for
select(@answer.class.to_s.underscore, :question_id, option_groups_from_collection_for_select(@categories, 'questions.order(:display_order)', :name, :id, :question, @answer.question_id))
如果有更好的方法选择合适的值,我也会洗耳恭听


tl;dr:不,无论是form\u for还是simple\u form\u for,都看不到任何创建分组选择的方法,以上内容至少会有所帮助。

问题由来已久,但它是“simple\u form grouped select”的最高结果无论如何,谷歌搜索,所以我想下一个读者可能会受益于一些创造性的方法,用最新的simple_表单创建这些内容(取自测试,这些都是最好的文档)

:分组\u选择,
:collection=>['Authors'、['Jose'、['Carlos']]、['General'、['Bob'、['John']]、['General'、['Bob'、'John']],
:group_method=>:last%>
:分组并选择,
:collection=>Proc.new{[['Authors',['Jose','Carlos']],['General',['Bob','John']]},
:group_method=>:last%>
:分组并选择,
:collection=>{['Jose','Carlos']=>'Authors'},
:group_method=>:首先,
:group\u label\u method=>:last%>
:分组并选择,
:collection=>{'Authors'=>['Jose','Carlos']},
:group_method=>:last,
:label_method=>:upcase,
:value_method=>:downcase%>

如果您有两个属于类别的模型,子类别如下:

class Category < ActiveRecord::Base
    has_many :products
    has_many :subcategories
end

class Subcategory < ActiveRecord::Base
    belongs_to :category
    has_many :products
end
类别
然后你可以用

<%= simple_form_for [:admin, @yourmodel] do |f| %>
    <%= f.input :subcategory_id, collection: Category.all, as: :grouped_select, group_method: :subcategories, prompt: "Select One" %>
    <%= f.submit "Submit" %>
<% end %>

其结果如下:

<div class="form-group grouped_select optional yourmodel_subcategory_id">
    <label class="grouped_select optional control-label" for="yourmodel_subcategory_id">Subcategory</label>
    <select class="grouped_select optional form-control" id="yourmodel_subcategory_id" name="yourmodel[subcategory_id]">
    <option value="">Select One</option>
    <optgroup label="Your 1st Category">
        <option value="This subcategory id">one subcategory belongs to Your 1st Category</option>
    </optgroup>
    <optgroup label="Your 2nd Category">
        <option value="This subcategory id">one subcategory belongs to Your 2nd Category</option>
    </optgroup>
    </select>
</div>

子类别
选择一个
一个子类别属于您的第一个类别
一个子类别属于您的第二个类别

希望这能有所帮助。

我刚刚也查看了测试。 如果要将不同的值传递给选项标记,请使用以下命令将其传递给集合:

Agent = Struct.new(:id, :name)
agents = [["First", []], ["Second", [Agent.new(7, 'Bond'), Agent.new(47, 'Hitman')]]]

请参见已将分组选择框添加到simple_form 2.0.Spot on。感谢您提供多种不同的解决方案。我希望他接受你的回答。我假设这是简单形式2.0+?或者像我在2010年试着使用的那样,这对旧的simple_表单有效吗!第一个解决方案对我非常有效。非常感谢!你能解释一下你为什么使用:第一组方法吗?我正试着把我的想法围绕在它周围…这让我有一段时间感到困惑,所以这是我对它的看法。可以将任何对象作为集合传入。散列、数组、AR对象等。它需要可迭代。其中的每个“事物”都成为一个组对象。在此组对象上调用“组标签方法”,它返回的内容用作组标签group method也在group对象上调用,返回的是value对象。值对象需要是可迭代的。简单表单循环遍历它,对每个元素调用“label-method”和“value-method”。这为我们提供了每个选择选项的标签和值。容易,嗯?哦。。天哪。先生,你真是个奇迹。我刚刚花了一个小时的时间来整理一些东西,以得到一个数组,一组数组,数组内。。根据所选答案。然后我看到了你的解释,我在20秒内重复了同样的解释。非常感谢你。我把这个完全倒过来了。
Agent = Struct.new(:id, :name)
agents = [["First", []], ["Second", [Agent.new(7, 'Bond'), Agent.new(47, 'Hitman')]]]