Comment créer une boîte de sélection groupée à l'aide simple_form?
-
26-09-2019 - |
Question
J'utilise gem simple_form pour créer des formulaires Rails. http://github.com/plataformatec/simple_form
Tout est très bien, sauf comment puis-je créer une boîte de sélection groupée? Impossible de trouver dans la documentation ou par google-ing.
La solution
La question est vieux, mais il est le résultat supérieur pour « simple_form Groupés sélectionnez » google recherche de toute façon, donc je pensais que le prochain lecteur pourrait bénéficier de quelques façons créatives de créer avec la dernière simple_form (tiré de tests, qui sont toujours les meilleure documentation en effet)
<%= 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 %>
Autres conseils
Si vous Hava deux modèles qui appartiennent à la catégorie, la sous-catégorie comme suit:
class Category < ActiveRecord::Base
has_many :products
has_many :subcategories
end
class Subcategory < ActiveRecord::Base
belongs_to :category
has_many :products
end
Ensuite, vous pouvez utiliser
<%= 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 %>
qui résultent comme ceci:
<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>
Hope this helps.
La seule façon saine d'esprit que j'ai trouvé pour créer regroupés boîtes de sélection est d'utiliser l'assistant de sélection qui passe dans un grouped_options_for_select qui fait prendre un paramètre selected_key pour l'argument de choix (afin de vous assurer les thats définis dans votre modèle obtient effectivement choisi). Vous verrez l'appel complet ci-dessous. Désolé si sa confusion.
-# @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))
S'il y a une meilleure façon de le faire qui choisit la bonne valeur, je suis tout ouïe aussi bien.
tl; dr. Nope ne voyant aucune façon soit form_for ou simple_form_for pour créer groupées sélectionne, ce qui précède devrait aider au moins
Je viens d'avoir un regard sur les essais aussi bien. Si vous voulez passer une valeur différente pour la balise option, utilisez ce qui suit pour passer à la collection:
Agent = Struct.new(:id, :name)
agents = [["First", []], ["Second", [Agent.new(7, 'Bond'), Agent.new(47, 'Hitman')]]]