Как создать сгруппированный блок выбора, используя simple_form? - PullRequest
19 голосов
/ 28 октября 2010

Я использую гем simple_form для создания форм Rails. http://github.com/plataformatec/simple_form

Все отлично, кроме как создать сгруппированный блок выбора? Не могу найти его в документах или через Google.

Ответы [ 4 ]

87 голосов
/ 14 июня 2012

Вопрос старый, но в любом случае это лучший результат поиска "simple_form grouped select" в поиске Google, поэтому я подумал, что следующий читатель может воспользоваться несколькими творческими способами создать их с использованием самой последней simple_form (взятой из тестов, которые всегдалучшая документация действительно)

<%= f.input :author,
 :as => :grouped_select,
 :collection => [['Authors', ['Jose', 'Carlos']], ['General', ['Bob', 'John']]],
 :group_method => :last %>

<%= f.input :author,
 :as => :grouped_select,
 :collection => Proc.new { [['Authors', ['Jose', 'Carlos']], ['General', ['Bob', 'John']]] },
 :group_method => :last %>

<%= f.input :author,
 :as => :grouped_select,
 :collection => { ['Jose', 'Carlos'] => 'Authors' },
 :group_method => :first,
 :group_label_method => :last %>

<%= f.input :author,
 :as => :grouped_select,
 :collection => { 'Authors' => ['Jose', 'Carlos'] },
 :group_method => :last,
 :label_method => :upcase,
 :value_method => :downcase %>
7 голосов
/ 31 марта 2015

Если у вас есть две модели категории, подкатегория выглядит следующим образом:

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>

Надеюсь, это поможет.

0 голосов
/ 10 марта 2016

Я только что посмотрел тесты.Если вы хотите передать другое значение тегу option, используйте следующее для передачи его в коллекцию:

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

см. https://github.com/plataformatec/simple_form/blob/master/test/inputs/grouped_collection_select_input_test.rb

0 голосов
/ 02 декабря 2010

Единственный здравый способ, который я нашел для создания сгруппированных блоков выбора, - это использование помощника выбора, передающего grouped_options_for_select , который делает принимает параметр selected_key для аргумента выбора (так что выможет гарантировать, что тот, который установлен в вашей модели, действительно выбран).Вы увидите полный звонок ниже.Извините, если это сбивает с толку.

-# @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_for или simple_form_for для создания сгруппированных выборок, вышеприведенное должно помочь по крайней мере.

...