Boire ou coder ... Pourquoi choisir?
Publié le 23 août 2009 22:00

Rails et routes : remplacer l'identifiant dans l'url par une chaine de caractères

Lorsque vous définissez, dans une application rails, des url spécifiques avec map.resources, celles-ci finissent de la forme suivante :

/post/1 Ou 1 est l'identifiant de l'uplet dans la base et blog est le nom de la ressource. C'est cool parce que ça permet d'avoir des url assez courtes simplement. Mais d'un point de vue utilisateur, y'a mieux. Avoir une url du genre de /post/titre-du-billet Serait un peu mieux non ? C'est particulièrement simple :)

Map.resources utilise la méthode to_param des modèles. Méthode qui, par défaut, retourne la valeur de l'identifiant. Si vous la modifiez en placant :

def to_param
    title
end
Ce n'est plus l'identifiant de votre uplet qui sera retourné mais la valeur du champ titre. A vous donc ensuite d'avoir un titre correct.

Et lorsque vous appellerez la méthode vous permettant d'avoir l'url vers votre billet :

post_url @post
Ce n'est plus /post/1 qui sera retourné mais /post/titre-de-votre-billet.

Bien évidemment la valeur de title doit être correctement formatée pour rendre une url (suppression des accents et espaces etc). Rails ne fait pas cela automatiquement. Mais ce genre de méthode ne fait pas partie du sujet de cet article. Cela sera pour un autre :)

Commentaires

loïc m.
loïc m. dit: 23 août 2009 22:00 Site web

il faut également penser à faire en sorte que chaque titre soit unique. par exemple on peut ajouter un incrémente de 1 dès qu'on rencontre le même titre : liens-en-vrac liens-en-vrac-2 liens-en-vrac-3 ...

Damien
Damien dit: 23 août 2009 22:00 Site web

En n'oubliant pas, afin d'être sur, de mettre une règle d'unicité sur le champ de titre.

J'ai oublié de le préciser dans l'article. Mais il y a l'excellent plugin permalink fu. http://agilewebdevelopment.com/plugins/permalink_fu

Postez un commentaire

Markdown activé