2009-03-08 17 views
57

Ähnlich wie diese Frage: Checkboxes on RailsRadiobuttons on Rails

Was ist der richtige Weg, Radio-Buttons zu machen, die auf eine bestimmte Frage in Ruby on Rails verwandt sind? Im Moment habe ich:

<div class="form_row"> 
    <label for="theme">Theme:</label> 
    <br><%= radio_button_tag 'theme', 'plain', true %> Plain 
    <br><%= radio_button_tag 'theme', 'desert' %> Desert 
    <br><%= radio_button_tag 'theme', 'green' %> Green 
    <br><%= radio_button_tag 'theme', 'corporate' %> Corporate 
    <br><%= radio_button_tag 'theme', 'funky' %> Funky 
</div> 

ich auch automatisch zu überprüfen, die zuvor ausgewählten Elemente in der Lage sein soll (wenn diese Form wurde neu geladen). Wie würde ich die Parameter in den Standardwert dieser laden?

Antwort

74

Wie in this previous post, mit einer leichten Drehung:

<div class="form_row"> 
    <label for="theme">Theme:</label> 
    <% [ 'plain', 'desert', 'green', 'corporate', 'funky' ].each do |theme| %> 
     <br><%= radio_button_tag 'theme', theme, @theme == theme %> 
     <%= theme.humanize %> 
    <% end %> 
</div> 

Wo

@theme = params[:theme] 
+3

Sie könnten 'vereinfachen [ 'Ebene', 'Wüste', 'grün', 'Corporate', 'Funky']' auf '% w (plain Wüste grün Corporate flippige)' – gabe

1

Hmm, aus der docs sehe ich nicht, wie Sie die ID auf den Radio-Tasten einstellen können ... das Etikett für Attribut versucht, mit der ID auf dem Radio zu verknüpfen.

rails docs for radio_button_tag

Das heißt, aus dem doc, dass erste param der "Name" ist ... die, wenn sie das ist, was es schafft, sollte Gruppe sie alltogether. Wenn nicht, vielleicht ist es ein Fehler?

Hmm, Wunder, wenn diese behoben worden: http://dev.rubyonrails.org/ticket/2879 http://dev.rubyonrails.org/ticket/3353

36

Gleiche wie V, aber Zu jedem Optionsfeld gehören Labels. Durch Klicken auf das Label wird das Optionsfeld aktiviert.

<div class="form_row"> 
    <p>Theme:</p> 
    <% [ 'plain', 'desert', 'green', 'corporate', 'funky' ].each do |theme| %> 
    <br><%= radio_button_tag 'theme', theme, @theme == theme %> 
    <%= label_tag "theme_#{theme}", theme.humanize %> 
    <% end %> 
</div> 
+0

Mit 'label_tag' hilft Verbessere die UX :) – abhishek77in

4

Ich würde vorschlagen, einen Blick auf formtastic

mit Es Radioknopf macht und Kastenleerung überprüfen erheblich einfacher und übersichtlicher. Ihr Code aussehen würde so:

<% semantic_form_for @widget, :html => {:class => 'my_style'} do |f| %> 
<%= f.input :theme, :as => :radio, :label => "Theme:", 
:collection => [ 'plain', 'desert', 'green', 'corporate', 'funky' ] %> 
<% end %> 

Formtastic weitgehend unauffällig und gemischt und mit der „klassischen“ Form Builder angepasst werden kann. Sie können auch die formtastic CSS-Klasse für die Form außer Kraft setzen, wie ich oben tat mit
:html => {:class => 'my_style'}

einen Blick auf die einschlägigen Railscasts.

Update: Ich bin vor kurzem umgezogen zu Simple Form, die ähnliche Syntax zu formtastic hat, aber leichter ist und vor allem das Styling zu Ihrem eigenen CSS verlässt.

8

Mit Haml, überflüssige br-Tags loswerden und Eingaben innerhalb des Labels verschachteln, so dass sie ausgewählt werden können, ohne dass die Labels den IDs entsprechen. Auch mit form_for. Ich würde dies als Best Practice betrachten.

= form_for current_user do |form| 
    .form_row 
    %label Theme: 
    - [ 'plain', 'desert', 'green', 'corporate', 'funky' ].each do |theme| 
     %label 
     = form.radio_button(:theme, theme) 
     = theme.humanize