2 UML-based Web Engineering - UWE - Ludwig-Maximilians ...
2 UML-based Web Engineering - UWE - Ludwig-Maximilians ...
2 UML-based Web Engineering - UWE - Ludwig-Maximilians ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Am Code für die entsprechende Action im Rails-Controller lässt sich gut erklären, welche der<br />
Informationen, die in obigem Modellausschnitt enthalten sind, plattformspezifisch in der<br />
Steuerungsschicht umgesetzt werden, und wie dies geschieht:<br />
1 def show_details<br />
2 @publication = Publication.find(params[:id])<br />
3 render(:template => 'publications/show_details')<br />
4 end<br />
Mit den Schlagwörtern def und end wird in Zeile 1 und 4 die Methodendeklaration eingeleitet<br />
bzw. beendet. Zeile 3 enthält einen abschließenden render-Befehl, mit dem die View<br />
angewiesen wird, das Template mit dem Namen 'show_details' im (View)-Ordner<br />
'publications' zu rendern und an den Client zu schicken. Wie bereits festgestellt, kennt Rails<br />
keine abstrakten Navigationsknoten – im Controller wird direkt mit den View-Templates<br />
gearbeitet, die ihre Entsprechung auf Modellebene in Elementen des Präsentationsmodells<br />
haben. In Zeile 2 wird eine Instanzvariable (@publication) mit dem Publikations-Objekt<br />
gesetzt, dessen Details angezeigt werden sollen. Dieses Objekt entspricht dem Eingabeobjekt,<br />
das der Zielknoten Publication über den Navigationslink von PublicationList<br />
erhält (d.h .dem Objekt, das an dem «index» ausgewählt wurde). Es muss mit Hilfe der<br />
Klassenmethode find der Modell-Klasse Publication explizit aus der Datenbank<br />
gelesen werden. Dazu bedient sich die Action der ID des betreffenden Publikationsobjekts,<br />
die aus der URL des HTTP-Requests extrahiert wurde und im params-Objekt zu finden ist,<br />
über das der Action die HTTP-Parameter der Anfrage zur Verfügung gestellt werden 71 . Das zu<br />
rendernde Template hat Zugriff auf die Instanzvariable @publication, somit kann das<br />
Template dynamisch mit den Daten der ausgewählten Publikation aufgefüllt werden. Hier<br />
wird wiederum ersichtlich, wie Rails ohne eine abstrakte Zwischenschicht auskommt, die bei<br />
<strong>UWE</strong> durch das Navigationsmodell gestellt wird: Während bei <strong>UWE</strong> Präsentationsgruppen<br />
einen Navigationsknoten als Kontext besitzen, der die Daten zur Verfügung stellt, welche von<br />
UI-Elementen der Gruppe angezeigt werden sollen, operieren Rails-Templates direkt auf<br />
Instanzen von Inhaltsmodell-Klassen. Damit beantwortet sich auch die Frage, an welcher<br />
Stelle einer Rails-Anwendung Navigationseigenschaften definiert werden: Genauso wie die<br />
sie besitzenden Navigationsklassen existieren solche Konstrukte dort nicht, stattdessen<br />
extrahiert die View die zur Anzeige bestimmten Daten direkt aus Modellobjekten.<br />
Viele der bis jetzt in diesem Abschnitt gemachten Erläuterungen treffen auch die<br />
Implementierung von Prozessklassen zu. Für einen einfach strukturierten Prozess wie z.B.<br />
EditPublication im PVS, dessen Workflow-Aktivität genau eine UserAction enthält<br />
(zur Repräsentation des <strong>Web</strong>formulars zur Angabe der Publikations-Daten), werden zwei<br />
Controller-Aktionen benötigt. Die, die (zeitlich) zuerst aufgerufen wird, ist dafür zuständig,<br />
das entsprechende Template zur Eingabe der Prozessdaten (also z.B. ein <strong>Web</strong>formular)<br />
festzulegen und der View zum Rendern zu übergeben. In einem Fall wie dem Editieren einer<br />
bereits bestehenden Publikation muss außerdem, ähnlich zum gerade diskutierten Beispiel,<br />
das zu editierende Objekt aus der Datenbank geladen und über eine Instanzvariable dem<br />
entsprechenden Template zugänglich gemacht werden, damit dort die Anfangswerte der<br />
Eingabefelder in Abhängigkeit von dem betreffenden Objekt festgelegt werden können. Wenn<br />
man die hier vorgeschlagene Übersetzungsregel 'Navigationslink – Controller-Action' auch<br />
auf Prozessklassen und deren Einbindung in das Navigationsmodell anwenden möchte, so<br />
71 Dieses Objekt besitzt eine Hash-Struktur, d.h. es speichert die Namen der HTTP-Parameter als Schlüssel und<br />
die Parameterwerte als Schlüsselwerte. Wie im Code-Beispiel ersichtlich, können die Werte über die<br />
entsprechenden Schlüssel abgerufen werden.<br />
84