2012-04-04 5 views
1

Mit simple_form rendere ich einige Optionsfelder, um Geschlecht auf Registrierungsseite auszuwählen.simple_form rendert die Optionsfelder falsch

Code:

 = f.input :gender, 
       :collection => gender, 
       :as => :radio_buttons, 
       :item_wrapper_class => 'inline' 

Dies ergibt folgende Ausgabe:

enter image description here

Gibt es eine Möglichkeit das erste Optionsfeld sein hinter Male und der zweiten Radio-Button hinter weiblich zu machen?

+0

verwendet werden Haben Sie überprüft, dass die html es produziert falsch? Weil es für mich wie ein Styling-Problem aussieht. – Gerry

+0

Was ist der Inhalt der 'gender' Variablen/Methode? Ist es ein Array? –

Antwort

4

Hier ist eine bessere Lösung als mein Original unten.

Vom Code:

# form_for @user do |f| 
#  f.collection_radio_buttons(
#  :options, [[true, 'Yes'] ,[false, 'No']], :first, :last 
# ) do |b| 
#  b.label { b.radio_button + b.text } 
#  end 
# end 

Ich denke, das ist das, was Sie suchen,:

<%= f.collection_radio_buttons(
    :gender, [['Male', 'Male'], ['Male', 'Male']], :first, :last 
) do |b| 
    b.label { b.text + b.radio_button } 
    end 
%> 

Sie können auch hinzufügen, andere Helfer wie image_tag dort auch:

<%= f.collection_radio_buttons(
    :gender, [['Male', 'Male'], ['Male', 'Male']], :first, :last 
) do |b| 
    b.label { image_tag("#{b.text}.png") + b.radio_button } 
    end 
%> 

Diese Lösung ist keine normale benutzerdefinierte Komponente. Diese benutzerdefinierte Komponente erbt von CollectRadioButtonsInput anstelle der normalen CollectionInput-Klasse. Ich habe die 2 relevanten Methoden modifiziert.

Innen app/inputs/radio_buttons_left_label_input.rb

class RadioButtonsLeftLabelInput < SimpleForm::Inputs::CollectionRadioButtonsInput 
    def input 
    label_method, value_method = detect_collection_methods 

    @builder.send("collection_radio_buttons", 
     attribute_name, collection, value_method, label_method, 
     input_options, input_html_options, &collection_block_for_nested_boolean_style 
    ) 
    end 

    protected 

    def build_nested_boolean_style_item_tag(collection_builder) 
    collection_builder.text.html_safe + collection_builder.radio_button.html_safe 
    end 
end 

Es kann wie dieser

<%= form.input :gender, 
    :as => :radio_buttons_left_label, 
    :collection => %w[Female Male] 
%> 
+0

Ich muss dies versuchen thx zum Posten;) Wenn es funktioniert, gebe ich die Frage thx – Rubytastic

+0

Hallo @Rubytastic wie bist du gegangen? Hast du meinen letzten Schnitt gesehen? Ich lege es an die Spitze und es ist die richtige Art zu tun, was Sie gefragt haben, keine Hacks erforderlich. Ich habe es schließlich als Kommentar im simple_form-Code gefunden. – 23inhouse

+0

Immer noch nicht voll funktionsfähig Ich machte eine Follow-up auf diese seit dieser Post bekommt ein Durcheinander, gewährt für die Post zurück auf diese. Es scheint ein seltsames Problem mit Ihrem Code zu sein, der dazu führt, dass Zahlen gedruckt werden. Bitte lesen Sie http://StackOverflow.com/questions/11272764/Simple-Form-Render-image-x-label-mit-twitter-bootstrap – Rubytastic

1

Nicht sicher von der genauen Sache, aber es gibt etwas namens Reihenfolge, die zugewiesen werden kann, welches Tag zuerst angezeigt werden soll, z. [: label,: input] und auch inlining können hier helfen.

1

Haben Sie versucht, die Sammlung einfach in der von Ihnen gewünschten Reihenfolge zu erstellen oder zu sortieren?

some wie folgt aus:

= f.input :gender, 
    :collection => gender.reverse, 
    :as => :radio_buttons, 
    :item_wrapper_class => 'inline' 

Offensichtlich ist dies nicht die bessere Lösung. Sie sollten die Liste in der richtigen Reihenfolge erstellen.

+0

Thx für den Kommentar, es tauscht tatsächlich nur die Tasten aus, die keine Lösung sind, das Problem ist wie im Bild, dass "Gender" (Label) direkt vor dem ersten Radiobutton steht wo das "Male" gewesen sein soll dann ein (*) Weiblich – Rubytastic

+0

Sorry, ich habe zu schnell geantwortet. – Dougui