ruby on rails - rails - ¿Cómo crear un cuadro de selección agrupado usando simple_form?
simple form hidden (4)
Estoy usando la gema simple_form para crear formularios de Rails. http://github.com/plataformatec/simple_form
Todo está bien, excepto ¿cómo creo un cuadro de selección agrupado? No puedo encontrarlo en los documentos o por google-ing.
Acabo de echar un vistazo a las pruebas también. Si desea pasar un valor diferente a la etiqueta de opción, use lo siguiente para pasarlo a la colección:
Agent = Struct.new(:id, :name)
agents = [["First", []], ["Second", [Agent.new(7, ''Bond''), Agent.new(47, ''Hitman'')]]]
La única forma sensata que he encontrado para crear cuadros de selección agrupados es utilizar el asistente de selección que pasa en un grouped_options_for_select que toma un parámetro selected_key para el argumento de las opciones (para que pueda asegurarse de que se seleccione el que está configurado en su modelo). Verás la llamada completa a continuación. Lo siento si es confuso.
-# @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))
Si hay una mejor manera de hacer esto que seleccione el valor adecuado, yo también lo soy todo.
tl; dr: no, no ve ninguna forma con form_for o simple_form_for para crear selecciones agrupadas, lo anterior debería ayudar al menos.
La pregunta es antigua, pero es el resultado principal para la búsqueda de Google "simple_form grouped select" de todos modos, así que pensé que el siguiente lector podría beneficiarse de algunas formas creativas para crearlas con el último simple_form (tomado de las pruebas, que siempre son la mejor documentación) )
<%= 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 %>
Si tiene dos modelos que son categoría, subcategoría de la siguiente manera:
class Category < ActiveRecord::Base
has_many :products
has_many :subcategories
end
class Subcategory < ActiveRecord::Base
belongs_to :category
has_many :products
end
Entonces puedes usar
<%= 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 %>
que resulta así:
<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>
Espero que esto ayude.