Rails: Sind echte Permalinks es wert?

Vor nicht allzulanger Zeit habe ich über eine Methode geschrieben, mit der man sehr einfach sprechende URLs in Ruby on Rails einbauen kann. Dabei wird etwas gecheatet, denn die ID über welche die eigentliche Referenzierung läuft ist noch ein Teil der URL. Wie sieht es aber aus, wenn man die ID auch noch loswerden will? Vorweg: Dieser Artikel ist kein Tutorial dazu, sondern viel mehr ein Abwägen des Für und Widers, denn das Erzeugen und Verarbeiten von richtig cleanen URLs ist mit einem Aufwand verbunden, welcher aus meiner Sicht den Wert des Nutzens übersteigt.

Wir wollten bei wevent cleane URLs einsetzen, haben uns aber letztendlich aus mehreren Gründen dagegen entschieden:

1. Alles nicht so einfach wie gedacht

Für jedes Modell, welches per Permalink referenziert werden soll, muss es eine extra Eigenschaft permalink oder ähnliches geben. Grund dafür ist, dass wir uns auf den Namen alleine nicht verlassen können - dies geht zwar bei einfachen Worten, sobald aber Umlaute oder Leerzeichen ins Spiel kommen, können wir danach nicht mehr über den Namen (beispielsweise einer Stadt) aus der DB selektieren:

http://beta.wevent.org/cities/Muenchen

Ist das “ue” im Permalink jetzt drin, weil die unsere to_permalink-Methode es generiert hat oder steht der Name schon mit “ue” in der DB? “München” und “Muenchen” könnten wir nicht unterscheiden (um mal eines der unwahrscheinlicheren Beispiele zu nennen ;)).

Also mit einer extra Eigenschaft…

Eine Eigenschaft permalink, welche von anderen Modellattributen wie Name oder Datum abhängig ist bedeutet Wartungsaufwand: Es muss garantiert sein, dass der Permalink angepasst wird, wenn sich eine der Eigenschaften von denen er abhängt ändert, da sonst die Referenzierung über die URL nicht mehr läuft… von der Fehleranfälligkeit abgesehen müssten wir auch alle schon in der DB vorhandenen Instanzen updaten, damit sie auch einen Permalink haben (lässt sich automatisieren, trotzdem bedeutet es Aufwand).

Generierte RESTful Routes greifen nicht mehr

Vorgabe für die von Rails per map.resources generierten Routes ist es, dass die referenzierende Eigenschaft die ID ist - bedeutet im Umkehrschluß für uns, dass wir die generierten Routes nicht mehr nutzen können und sowohl für alle bestehenden Actions als auch für alle die noch dazukommen immer selber Routes anlegen müssen… bitte?

Preis/Leistung stimmt nicht

Für mich rechtfertigt der letztendliche Nutzen den Aufwand nicht, wenn man bedenkt, dass es nur um saubere URLs geht, die Implementierung unseren Code aufbläht und das System fehleranfälliger macht. Vielleicht wird es dafür ja mal Plugins geben - dann kann man drüber nachdenken, beim aktuellen Stand sehe ich allerdings davon ab, es mit aufzunehmen. Ich fände es auch schöner pretty URLs zu haben - das was wir jetzt haben ist allerdings mit 3 Zeilen Code pro Modell realisiert, wenn wir den nächsten Schritt gehen wollten, brauchen wir dafür einiges mehr an Code - für mich scheidet das vorerst raus.

iOS app for GitHub

iOctocat

ist GitHub für die Hosentasche - deine Projekte und das was dort passiert immer dabei mit deinem iPhone und iPod Touch.
Die App ist