Action View
Nachdem die Datenvorhaltung erläutert wurde, kommen wir nun zum "V" von MVC. Das "V" steht hierbei
für die Views, sie sind in Rails als Action Views bekannt. Ein Action View ist ein Verbund
aus einem Template, den vom aufrufenden Controller bereitgestellten Umgebungvariablen und
Formatierungshelfern.
Templatekonventionen
URL: http://.../blog/list
Template: app/views/blog/show[.rhtml | .rxml]
Helper: BlogHelper
Helper-Pfad: app/helpers/blog_helper.rb
[top]
Buildertemplates
Buildertempaltes dienen der Erzeugung von strukturierten Texten, u.a. XML-Dokumenten. Diese
Templateart wird durch die Endung .rxml gekennzeichnet und ermöglicht es beliebig komplexe
XML-Dokumente zu erzeugen. Verwendet wird dabei die Ruby Bibliothek Builder, auf welcher in
ihrer Gesamtheit hier nicht eingegangen werden soll. Zur Vollständigkeit ein kleines
Beispiel:
Das TempalteDer Output<example lang="rails">
<name>an Example</name>
<line>
<linenumber>1</linenumber>
<content>foo</content>
</line>
<line>
<linenumber>2</linenumber>
<content>bar</content>
</line>
</example>
[top]
RHTML-Templates
Durch seine Auslegung als Webframework ist der bevorzugte Outputtyp von Rails XHTML, welches auf
XML aufsetzt. Das legt die Verwendung von Buildertemplates nahe. Daher die Frage: Wozu wird dann
die RHTML-Tempaltes benötigt?
Sie vereinfachen das Erstellen von XHTML-Dokumenten, indem einfach ein fertiges
XHTML-Dokument als Ausgangsmaterial verwendet werden kann, ein Beispiel hierfür:
XHTML (statisch)
<h1>Ein String</h1>
<p> Ein anderer String </p>
RHTML (dynamisch)
<h1><%= @params.einString %></h1>
<p> <%= @params.EinAndererString %> </p>
Wie zu erkennen ist, wurden die statischen Teile im XHTML durch ein
"<%= ... %>"
ersetzt. ähnlich wie bei den „Java Server Pages" wird der umschlossene Ruby-Code ausgewertet
und das Ergebnis als String in das Template integriert. Da jeglicher Code ausgewertet wird,
kann theoretisch auch erst hier die Verarbeitung der params des Controllers implementiert werden,
was jedoch nicht mit der Trennung der einzelnen Bereiche der MVC-Architektur einhergeht. Ein
weiteres Problem wäre es, das zwingend ein String ausgegeben werden muss.
Manchmal ist dennoch ein wenig Logik für die Ausgabe, z.B. in Form einer Ausgabeschleife für Datensätze, notwendig.
Deshalb existiert noch ein zweiter Ausdruck, dessen umschlossener Code wird nur
ausgeführt/verarbeitet und keinen Output erzeugt:
"<% ... %>".
Listenerzeugung in RHTMLInterpretiert wird dies von Rails wie folgt:
Mittels dieser Vorgehensweise und unter der Verwendung von Bedingtenverzweigungen, kann ein
Template sehr flexibel auf alle erdenklichen Bedingungen der Controllerumgebung reagieren und
so eine optimale Darstellung garantieren.
[top]
Layouts / Partials
Layouts
Die bis jetzt betrachteten Templates stellen für sich gesehen nur den dynamischen Teil einer Webseite
dar und müssen somit von einem anderen Template umschlossen sein. Dies macht auch Sinn, da sich diese
Template nicht dynamisch ändern. Typsicherweise ist ein Layout, wiederrum ein Template und wie folgt
aufgebaut:
app/views/layouts/newslist.rhtml
Wichtig ist hierbei die Zeile <%= yield %>, sie sorgt dafür, dass zusätzlich zum Rendern des
Layouts noch das Tempalte der aktuellen Methode gerendert wird. Durch das "<%=" wird dieses
Ergebnis automatisch in das Layout integriert.
Auch bei dem Einbinden des Layouts für einen Controller ist Rails dank seiner Konventionen in der
Lage das gewünschte Layout automatisch zu integrieren. Hierzu sucht Rails im Verzeichnis nach
"app/views/layouts/controllerName.rhtml".
Manuelle Festlegung des LayoutsPartials
Durch den DRY-Ansatz von Rails ist es auch möglich für eine bestimmte Aufgabe/ein bestimmtes Model
ein eigenes Template anzulegen. Dieses kann dann z.B. für das Editieren, sowie für das Neuanlegen eines
Datensatzes verwendet werden.
[top]
Helper
Bei genauerem Betrachten des obigen Beispiels, fällt in der vierten Zeile das h(…) auf. Dieser kleine
Funktionsaufruf ist ein essenzieller Bestandteil von Rails, denn er dient dem Escapen von Sonderzeichen.
So wird z.B. das häufig zu SQL-Incection-Angriffen verwendete einfache Hochkommata durch seine
HTML-Repräsentation ersetzt.
Es gibt eine Menge von vorgefertigten Helpern, welche den Templates zur Verfügung stehen, so dass im
Folgenden nur eine Auswahl aufgezeigt wird:
Format-HelperLink-HelperForm-HelperField-HelperAnlegen von eigenen Helpern
Sollten die vordefinierten Helper nicht ausreichen, so kann man sich eigene Helper definieren. Gespeichert werden diese beispielsweise für den Controller login in der folgenden Datei:
App/helpers/login_helper.rb[top]