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…

8. März 2007 um 18:37
Bumi schreibt:
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)