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.

31. März 2007 um 07:58
Alex schreibt:
Moin Dennis,
das Catchen der ID über “Rückverfolgung” (Name aus DB suchen) hat auch mich schon in einige Schwierigkeiten gebracht. Ganz kompliziert wird es zum Beispiel auch bei Städten mit gleichen Namen wie zum Beispiel Frankfurt und Frankfurt oder Rotenburg und Rotenburg.
Und was die Umlaute angeht kann ich dir nur sagen, dass auch da Probleme auftauchen. Würde man zum Beispiel alle Umlauten Umwandeln (ä -> au; ö -> oe…) dann scheint das ganze auf den ersten Blick zu klappen. Später stellt man dann allerdings fest, dass es auch Städte gibt, die diese Buchstabenfolge beinhalten, diese aber nicht als Umlaut zu behandeln sind. Beispiel fällt mir gerade nicht ein, es gibt sie aber mit Sicherheit.
Schönen Gruß,
Alex
31. März 2007 um 18:02
Lutz schreibt:
Soest, Coesfeld…
18. September 2007 um 17:27
MP:Schorsch schreibt:
Hab gerade damit auch etwas spass in rails .. für mich sind anständige urls den aufwand auf jeden fall wert.
ich habe bisher in meinen cakePHP projekten die blog-titel-umwandlungsmethoden aus wordpress benutzt und im model dann ein feld “url_name” o.ä.
Wenn sich der name ändert muss man es natürlich irgendwo festhalten damit die alten links nicht zerschossen werden.
hast du nen tipp für nen rails string helper zur umwandlung von Umlauten?
18. September 2007 um 17:47
Dennis schreibt:
Hey Schorsch,
ich hab einfach String erweitert…
class String def sub_umlauts self.gsub(/Ö/, 'Oe').gsub(/Ä/, 'Ae').gsub(/Ü/, 'Ue') .gsub(/ö/, 'oe').gsub(/ä/, 'ae').gsub(/ü/, 'ue') .gsub(/ß/, 'ss') end end