O'Reilly logo

Rails Kochbuch by Rob Orsini

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

First
|
129
Max.
Linie
Max.
Linie
Kapitel 4
KAPITEL 4
Action Controller
4.0 Einführung
In der Rails-Architektur empfängt der Action Controller eingehende Requests und leitet
sie an eine bestimmte Aktion weiter. Der Action Controller ist eng mit dem Action View
verknüpft, die zusammen das Action Pack bilden.
Action Controller, oder einfach »Controller«, sind Klassen, die von
ActionController::Base
erben. Diese Klassen definieren die Geschäftslogik der Anwendung. Eine Immobilien-
Anwendung für das Web könnte einen Controller verwenden, der eine suchfähige Liste
der Immobilienangebote verarbeitet, während ein anderer Controller der Administration
der Site dient. Auf diese Weise werden Controller entsprechend den Daten gruppiert, die
sie bearbeiten. Controller entsprechen häufig dem Modell, an dem sie primär arbeiten,
auch wenn das nicht unbedingt der Fall sein muss.
Ein Controller besteht aus Aktionen, die die öffentlichen Methoden einer Controller-
Klasse darstellen. Um die eingehenden Requests zu verarbeiten, umfasst der Action Con-
troller ein Routing-Modul, dass URLs auf bestimmte Aktionen abbildet. Standardmäßig
versucht ein Request für http://railsurl.com/rental/listing/23 die
listing-Aktion des Cont-
rollers
RentalController aufzurufen, wobei die id 23 übergeben wird. Entspricht dieses
Verhalten nicht den Anforderungen Ihrer Anwendung, können Sie es (wie fast überall im
Rails-Framework) sehr einfach umkonfigurieren.
Nachdem der Action Controller ermittelt hat, welche Aktion den eingehenden Request
verarbeiten soll, übernimmt die Aktion ihre Arbeit: zum Beispiel die Aktualisierung des
Domänenmodells basierend auf den Parametern im Request-Objekt. Wenn die Aktion
abgeschlossen wurde, versucht Rails üblicherweise, ein View-Template zu rendern, das
den gleichen Namen wie die Aktion hat. Es gibt verschiedene Möglichkeiten, diesen nor-
malen Prozess zu verändern. Eine Aktion kann an andere Aktionen weiterleiten, oder es
kann das Rendering eines bestimmten Views anfordern. Letztendlich wird ein Template
oder irgendeine Form der Ausgabe gerendert, wodurch der Request-Zyklus abgeschlossen
wird.
00____RailsKochbuch.book Seite 129 Dienstag, 3. Juli 2007 8:13 08
Max.
Linie
Max.
Linie
130
|
Kapitel 4: Action Controller
Links
Zu verstehen, dass die Geschäftslogik in den Controller gehört und nicht in den View, und
dass die Domänenlogik in einem Modell vorliegen sollte, bildet den Schlüssel für die
Maximierung der Vorteile des MVC-Entwurfsmusters. Folgen Sie diesem Muster und Ihre
Anwendungen sind einfacher zu verstehen, zu pflegen und zu erweitern.
4.1 Aus einem Controller auf die Formulardaten
zugreifen
Problem
Sie besitzen ein Web-Formular, das Daten vom Benutzer einliest und an einen Controller
übergibt. Sie wollen innerhalb des Controllers auf diese Daten zugreifen.
Lösung
Verwenden Sie den params-Hash. Nehmen wir an, Sie verwenden das folgende Formular:
app/views/data/enter.rhtml:
<h2>Formulardaten - Eingabe</h2>
<% form_tag(:action => "show_data") do %>
<p>Name:
<%= text_field_tag("name","Web-Programmierer") %></p>
<p>Tools:
<% opts = ["Perl", "Python", "Ruby"].map do |o|
"<option>#{o}</option>"
end.to_s %>
<%= select_tag("tools[]", opts, :multiple => "true") %></p>
<p>Plattformen:
<%= check_box_tag("platforms[]","Linux") %> Linux
<%= check_box_tag("platforms[]","Mac OSX") %> Mac OSX
<%= check_box_tag("platforms[]","Windows") %> Windows</p>
<%= submit_tag("Daten speichern") %>
<% end %>
Wenn das Formular übertragen wurde, können Sie innerhalb des Controllers über das
params-Hash auf die Daten zugreifen.
app/controllers/data_controller.rb:
class DataController < ApplicationController
def enter
end
00____RailsKochbuch.book Seite 130 Dienstag, 3. Juli 2007 8:13 08
Max.
Linie
Max.
Linie
4.1 Aus einem Controller auf die Formulardaten zugreifen
|
131
Rechts
def show_data
@name = params[:name]
@tools = params[:tools] || []
@platforms = params[:platforms] || []
end
end
Diskussion
Der Webserver speichert die Elemente eines übertragenen Formulars im Request-Objekt.
Diese Elemente stehen Ihrer Anwendung über das
params-Hash zur Verfügung. Das
params-Hash ist einzigartig, weil Sie für den Zugriff auf dessen Elemente sowohl Strings,
als auch Symbole als Schlüssel verwenden können.
Abbildung 4-1 zeigt das Formular. Es verwendet drei verschiedene Arten von HTML-Ele-
menten.
Der folgende View gibt die im Formular gesammelten Daten aus. Die letzte Zeile enthält
einen Aufruf des debug-Template-Helpers, der den Inhalt des params-Hashes im yaml-For-
mat ausgibt:
Abbildung 4-1: Ein Formular mit verschiedenen HTML-Eingabelementen
00____RailsKochbuch.book Seite 131 Dienstag, 3. Juli 2007 8:13 08
Max.
Linie
Max.
Linie
132
|
Kapitel 4: Action Controller
Links
app/views/data/show_data.rhtml:
<h2>Formulardaten - Ausgabe</h2>
Name: <%= @name %>;
Tools: <%= @tools.join(", ") %>;
Platforms: <%= @platforms.join(", ") %>;
<hr>
<%= debug(params) %>
Abbildung 4-2 zeigt den gerenderten View.
Um auf das Feld
name des Formulars zuzugreifen, verwenden Sie :name als Schlüssel auf das
params-Hash (also params[:name]). Die gewählten Elemente der Multiauswahl-Listen und
Checkboxen werden im
params-Hash als Arrays gespeichert, die nach den zugehörigen
HTML-Elementnamen benannt sind.
Wenn Sie zum Beispiel das Formular übertragen und dabei Python und Ruby als Tools
und Mac OS X als Plattform gewählt haben, dann enthält das
params-Hash die folgenden
Arrays:
{ "tools"=>["Python", "Ruby"], "platforms"=>["Mac OSX"] }
Dieses Verhalten wird angestoßen, indem man [] an den Namen eines Elements anhängt,
das mehr als einen Wert enthalten kann. Wurden keine Elemente gewählt, gibt es in
params kein Einträge, die diesem Element entsprechen.
Abbildung 4-2: Ausgabe der Formulardaten in einem View mit zusätzlichen Debugging-Informationen
00____RailsKochbuch.book Seite 132 Dienstag, 3. Juli 2007 8:13 08

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required