8. März 2007

Rails: Permalinks für Modelle

Wieder eine herrlich einfache Sache mit großer Wirkung: Um Permalinks – bzw. sprechende URLs – für seine Modelle einzubauen ist nur eine Methode nötig:

def to_param
  "#{id}-#{username.gsub(/[^a-z1-9]+/i, '-')}"
end

In diesem Fall haben wir ein User-Modell, für welches die Methode to_param ganz einfach einen String mit der ID und dem Usernamen (bspw. 1-Dennis) zurückgibt – mehr muss man im Grunde gar nicht tun, da Rails den Rest handhabt.

Where the magic happens…

Der Schlüssel zum Erfolg liegt darin, immer die ID des Modells als ersten Teil der URL zu haben – der restliche String spielt keine Rolle, kann jedoch für Suchmaschinen sehr relevant sein. Wenn wir das Modell nun im View beispielsweise so verlinken

<%= link_to @user.username, { :action => :show, :id => @user) %>

wird Rails bei der Generierung der Route die to_param Methode des Users aufrufen, welche standardmäßig die ID des Modells zurückgibt. Da wir die Methode allerdings überschrieben haben, wird der von uns zurückgegebene Wert genommen. Wichtig dabei ist, dass die ID im View nicht direkt per :id => @user.id übergeben wird, da Rails sich sonst mit der ID begnügt und to_param nicht mehr aufruft.

Rails-intern wird beim Verarbeiten der URL der String, welcher laut Route die ID enthält (in unserem Fall 1-Dennis) in einen Integer umgewandelt – dabei geht der nicht-numerische Teil verloren und es bleibt nur die ID des Modells zurück. Daher ist es unter anderem auch möglich, dass sich beispielsweise der Name des Users ändern kann, ohne Auswirkungen auf bereits indizierte URLs zu haben: Es kommt nur auf die ID an, 1-Dennis ist also das gleiche wie 1-dbloete und so weiter…

Technorati Tags: , , , ,

Ein Kommentar

  1. Rails is MAGIC!
    Wenn ich z.B. im controller den User mit User.find_by_login suche und im model
    def to_param
    login
    end
    einfüge, dann kann ich das ganze sogar ohne ID machen.
    (siehe auch meinen post: http://railslabs.com/2007/2/6/suchmaschinenfreundliche-urls)

Du kannst die Kommentare zu diesen Eintrag durch den RSS-Feed verfolgen.
Um einen Trackback zu setzen, benutze bitte diese Trackback-URL.

Kommentar schreiben

Du bist momentan nicht eingeloggt. Login »