Ruby on Rails: ActionView: Formulare

Aus Wikibooks

Rails-API


Mit Formularen bestellen Surfer Artikel bei Amazon oder Ebay, sie tragen sich in ein Gästebuch ein oder nehmen an einer Online-Abstimmung teil. Auch die Temine in unserem Veranstaltungskalender legt der Administrator mit - genau - einem Formular an.

Wenn es darum geht Daten in eine Webapplikation einzugeben, verwenden wir Formulare. Bevor wir uns um die Verarbeitung auf dem Webserver, in Sonderfällen (JavaScript) auch auf dem Client-Rechner kümmern, wollen wir uns ansehen, wie man Formulare anlegt.

HTML-Formulare fangen mit einem Form-Tag (<form ..>) an. Die Parameter action und method geben an, mit welcher Methode (GET oder POST) die Formulardaten wohin (URL) übertragen werden, bzw. welche Aktion sie verarbeiten soll. Wie gewohnt können wir in Rails den HTML-Code knapp und klar mit Helpern erzeugen.

Die drei Rails-Helper um ein Formular anzulegen:

  • form_for
  • form_tag
  • form

Dazu eine pesönliche Einschätzung von mir, Oliver Haag, von der ich weiß, dass sie viele Rails-Entwickler teilen: Der für mich wichtigste Helper ist form_for, weil er die richtige Mischung aus Klarheit und Flexibilität bietet. In den meisten Fällen kann ich damit am einfachsten ausdrücken, was ich will. form_tag bietet noch mehr Flexibilität, deshalb komme ich manchmal nicht drumherum. Form ist noch kompakter, aber das Layout ist damit weitgehend vorgegeben. Und wenn es nicht um eine versteckte Quick and Dirty Adminoberfläche geht, will ich das nicht.

Schauen wir uns also (zuerst) form_for an:

Der form_for Helper[Bearbeiten]

Mit dem form_for-Helper schreiben wir nicht nur ein Formular, wir setzen auch ein Modell und eine Instanzvariable als Kontext.

Syntax:

<%
# Der form_for-Helper setzt die Instanzvariable "@event" 
# und das dazu gehörende Modell "event" als Kontext
%>
<% form_for(@event) do |form| %>
..
<% end %>

Auf diese Angaben können sich dann Field-Helper beziehen und wir müssen bei ihnen das Modell etc. nicht mehr angeben. Wenn die Attribute der Instanzvariable gefüllt sind, werden sogar die Felder entsprechend ausgefüllt. Das schauen wir uns noch genau an, wenn wir die Field-Helper besprechen.

<%
# Hier setzt der form_for Helper die @page Variable und das "page"-Modell als Kontext. 
# So können wir "f.text_field :menu" schreiben und es ist klar, 
# dass es um das Attribut "menu" von "@page" geht.
%>
<% form_for(@page) do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :menu %><br />
    <%= f.text_field :menu %>
  </p>
  <p>
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </p>
  <p>
    Vaterseite (Menüpfad): <br />
    <%= f.select :page_id, @available_pages %>
  </p>
  <p>
    <%= f.label :content %><br />
    <%= f.text_area :content %>
  </p>
  <p>
    <%= f.submit "Update" %>
  </p>
<% end %>

Field-Helper und form_for[Bearbeiten]

Buttons zum Senden (submit tags)[Bearbeiten]

<%= submit_tag %>


Label[Bearbeiten]

    <%= f.label :title %>
    ...

... >> ToDo

Einzeilige Eingabefelder (textfields)[Bearbeiten]

form.text_field(:attribute, options)
form.hidden_field(:attribute, options)
form.password_field(:attribute, options)

Gebräuchliche Optionen:

:size => 'nn'
:maxlength => 'nn'

Eingabebereiche (text areas)[Bearbeiten]

form.text_area(:attribute, options)

Gebräuchliche Optionen:

:cols => 'nn'
:rows => 'nn'

Radio-Buttons[Bearbeiten]

radio_button(object_name, method, tag_value, options = {})

Checkboxen[Bearbeiten]

form.check_box(:attribute, options, on_value, off_value)

Auswahllisten (selection lists)[Bearbeiten]

form.select(:attribute, choices, options, html_options)

Beispiel:

# pages_controller.rb
  def new   
    @page = Page.new(:page_id => 0, :title => "Dira Seminare ..", :menu => "Neue Seite")
    @pages = Page.find(:all).map {|p| [p.menu, p.id] }
  end
# new.html.erb
  <p>
    <%= f.label :page_id %><br />
    <%= f.select :page_id, @pages %>
  </p>

Um eine Option auszuwählen setzen wir sie im Modell. Das wird hier beim Erzeugen der Seite mit Page.new(:page_id => 0, ..) gemacht und ginge auch später explizit mit @page.menu_id = 0.

Verschachtelte Auswahllisten, Menüstruktur (grouped selection lists)[Bearbeiten]

Datums- und Zeitfelder[Bearbeiten]

Field-Helper ohne form_for[Bearbeiten]

Mehrere Modelle in einem Formular[Bearbeiten]

fields_for_helper