Routing

-Routing in Rails
-Verarbeitung der URL
-Fehlerbehandung / Catchall
-Beispiel: Setzen des Startseite
-Beispiel: Newsübersicht anhand des Datums
-Erzeugung von Links


Routing in Rails

Unter dem Routing wird im Kontext einer Railsanwendung das Umleiten der Benutzeranfragen an den richtigen Controller verstanden. Hierzu wird die angegebende URL anhand der in "config/routes.rb" festgelegten Regeln analysiert und ausgewertet. Sollte eine URL auf mehrere Reglen passen, wird die Regel verwendet, die zuerst in der Datei stehende Regel verwendet.

[top]

Verarbeitung der URL

Anfragen an Railsanwendungen haben typischerweise folgende Form:
http://ntrack/newslist/show/1
Diese URL wird anhand der in der Datei "config\routes.rb" festgelegten Routen analysiert und weiter verarbeitet. Diese wird beim Erzeugen der Anwendung mittels des Rails-Kommandos "rails" automatisch angelegt und mit einer default-Regeln gefüllt:
config\routes.rb Betrachtet man nun die oben beschriebene Anfrage, so wird diese anhand der map.connect-Anweisung folgendermaßen ausgewertet werden:
‘newslist/show/1' => ‘:controller/:action/:id' Wie aus dem Beispiel zu ersehen ist, wird die URL in die Variable @params anhand der map.connect-Regeln überführt. Nach diesem Schritt lädt Rails den passenden Controller im Verzeichnis "app/controlers", indem eine neue Instanz dieser Klasse erzeugt wird. Durch den Aufruf der generischen process()-Methode mit der @params-Variable wird die Verarbeitung gestartet.
[top]

Fehlerbehandung / Catchall

Fehlerbehandlung

Sollte die URL nicht auflösbar sein, da z.B. ein unbekannter Controller in der URL aufgerufen werden soll, so wird der Request mit einem "Routing Error" beantwortet. Existiert hingegen die unter "action" stehende Methode nicht, so wird diese Anfrage mit einem "Unknown Action" beantwortet. Liegt hingegen kein Datensatz mit der angegebenen ID vor, so erzeugt Activ Record eine Exception vom Typ "ActiveRecord::RecordNotFound".

Catchall

Das Anlegen einer Catchall-Route ist daher sinnvoll, da der Benutzer so keine Fehlermeldung als Antwort bekommt, sondern auf eine passende Seite umgeleitet wird.
Definition der Catchall-Route:
[top]

Beispiel: Setzen des Startseite

1. Schritt: Anlegen eines Controllers

Dieser Controller soll dem Anzeigen der Startseite dienen, er wird mittels der Befehls
> ruby script\generate controller Sayhallo say_it
erzeugt.

2. Schritt: Löschen der index.html

Die automatisch angelegte index.html im public-Verzeichnis der Railsanwendung muss gelöscht werden, da erst auf eine public\index.html geprüft wird, bevor Routing verwendet wird.

3.Schritt: Hinzufügen der neuen Route

Durch Hinzufügen der folgenden Route in die "config\routes.rb" wird nun die Anfrage von http://127.0.0.1 auf die neue Startseite umgeleitet:
Startseitenroute
[top]

Beispiel: Newsübersicht anhand des Datums

Neben diese typischen Routen können auch komplexere angelegt werden. Beispielsweise soll auf einer Nachrichtenseite alle Meldungen eines Zeitintervalls angegeben werden. Hierfür wird eine passende Route definiert:
Route: #Time News List: /show_by_date/ [year | year/month | year/month/day ]

Die Bestandteile der Routing-Regel im Einzelnen:

'show_by_date/:year/:month/:day'
Definiert den Aufbau einer URL, welche von dieser Routing-Regel erfasst wird. Hierbei werden die nach „show_by_date" kommenden Angaben in die Variablen year, month und day eingelesen.
:controller / :action
Da bei dieser speziellen Regel der Controller und die aufzurufende Methode nicht aus der URL ermittelt werden, müssen sie direkt gesetzt werden.
:requirements
Um eine korrekte Formatierung der Werte in den drei Variablen zu garantieren, werden ihre Werte mittels des im requirement-Flag stehenden Regulären-Ausdrucks geprüft.
:day/:month
Falls die Variablen nicht gesetzt werden, wird ihr Wert auf den angegebenen Wert gesetzt.
[top]

Erzeugung von Links

Um Links auf der Webseite zu erzeugen, sollte die Möglichkeit verwendet werden die die Funktion url_for() bereitstellt. Mit ihr kann gewährleistet werden, dass die Links innerhalb der Anwendung immer korrekt sind. Url_for() verhält sich kontextsensitiv, d.h. wenn sie im Kontext eines Controllers aufgerufen wird, verwendet die Funktion die Umgebungsattribute dessen:
Beispiel Auffällig sind hierbei die erzeugten URL b) und c), sowie d) und e). Dieses Verhalten erklärt sich wie folgt:
Die Funktion url_for() kontrolliert, ob sich die übergebenen Werte im Bezug auf die Attribute des aktuellen Controllers unterscheiden. Ist dies der Fall setzt for_url die Variablen zurück. Beispiele:
1) Bei b) ändert sich das Jahr, daher werden month und day auf den in der Route definierten Defaultwert gesetzt. Um dieses Verhalten zu umgehen muss die Flag :overwrite_params verwendet werden.
2) Bei d) ändert sich das Jahr nicht, daher werden month und day nicht zurückgesetzt. Doch auch dieses Verhalten lässt sich umgehen, indem man den month auf nil festlegt.

[top]