22 Stimmen

Wie erstellt man ein gruppiertes Auswahlfeld mit simple_form?

Ich verwende simple_form gem für die Erstellung von Rails-Formularen. http://github.com/plataformatec/simple_form

Alles ist prima, nur wie erstelle ich ein gruppiertes Auswahlfeld? Ich kann es weder in den Dokumenten noch beim Googeln finden.

1 Stimmen

Die gruppierte Auswahlbox wurde zu simple_form 2.0 hinzugefügt.

101voto

dolzenko Punkte 5810

Die Frage ist alt, aber es ist das Top-Ergebnis für "simple_form grouped select" Google-Suche sowieso, so dass ich dachte, der nächste Leser könnte von ein paar kreative Möglichkeiten, um diese mit dem neuesten simple_form (aus Tests, die immer die beste Dokumentation in der Tat sind) erstellen profitieren

<%= 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 %>

1 Stimmen

Genau richtig. Danke, dass Sie verschiedene Lösungen angeboten haben. Ich hoffe, er nimmt Ihre Antwort an.

0 Stimmen

Ich nehme an, dies ist für simple_form 2.0+? Oder würde dies mit älteren simple_form wie ich versucht, mit zurück im Jahr 2010 arbeiten.

1 Stimmen

Geld, Geld, Geld! Die erste Lösung hat bei mir perfekt funktioniert. Vielen Dank dafür!

9voto

hungming Punkte 91

Wenn Sie zwei Modelle haben, die einer Kategorie angehören, unterteilen Sie sie wie folgt:

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

class Subcategory < ActiveRecord::Base
    belongs_to :category
    has_many :products
end

Dann können Sie

<%= 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 %>

was zu folgendem Ergebnis führt:

<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>

Ich hoffe, das hilft.

0 Stimmen

Ach du meine Güte. Sie, Sir, sind ein Wunder. Ich habe gerade die letzte Stunde damit verbracht, etwas zusammenzubasteln, um ein Array von Arrays innerhalb von Arrays zu erhalten, wie in der ausgewählten Antwort. Dann sah ich Ihre Erklärung, und ich wiederholte das Gleiche in 20 Sekunden. Ich danke Ihnen vielmals. Ich hatte das völlig falsch verstanden.

0voto

neozen Punkte 93

Der einzige vernünftige Weg, den ich gefunden habe, um gruppierte Auswahlfelder zu erstellen, ist die Verwendung des Select-Helpers, der eine gruppierte_options_for_select die fait einen selected_key-Parameter für das choices-Argument (damit Sie sicherstellen können, dass der in Ihrem Modell festgelegte Schlüssel tatsächlich ausgewählt wird). Der vollständige Aufruf ist unten zu sehen. Tut mir leid, wenn es verwirrend ist.

-# @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))

Wenn es einen besseren Weg gibt, dies zu tun, der den richtigen Wert auswählt, bin ich ebenfalls ganz Ohr.

tl;dr: Nope nicht sehen, wie mit entweder form_for oder simple_form_for gruppierte Selects zu erstellen, sollte die oben genannten zumindest helfen.

0voto

Flov Punkte 1447

Ich habe mir die Tests auch gerade angeschaut. Wenn Sie eine Prüfung bestehen wollen anderer Wert in das Optionstag einfügen, verwenden Sie Folgendes, um es an die Sammlung zu übergeben:

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X