Vriendelijke URI's
Geplaatst door Matthijs Langenberg di, 14 nov 2006 11:38:00 GMT
Al sinds de web-2.Oh hype gestart is worden mooie URL’s als/articles/show/my-first-article
en /users/profile/quentin
geprefereerd boven
/articles/show/324
en /users/profile/1225
.
Maar er kleven ook grote nadelen aan URL’s als
/categories/meat/recipes/chunky-bacon
,
je stapt in feite van het gebruik van oplopende integers voor primary keys af.
Wat is het nut van je id
veld in je articles
tabel wanneer je
in je URL’s het title
veld gebruikt om artikelen de identificeren?
Want wat gebeurd er wanneer een gebruiker de titel van een artikel aan zou passen?
Bookmarks werken niet meer, de vriendelijke URL die door google geïndexeerd werd bestaat niet meer, wat betekend dat je legacy URL’s moet gaan onderhouden.
Het is een conventie die je gewoon niet wilt breken, het is het gewoon niet waard.
Gelukkig bestaat hiervoor een oplossing binnen rails die een tussenweg biedt. Het is mogelijk om van deto_param
methode binnen een ActiveRecord model gebruik te maken om
toch vriendelijke URL’s te gebruiken, welke wel het id binnen de URL bevatten, een simpel voorbeeld:
class Article < ActiveRecord::Base
validates_presence_of :title
def to_param
"#{id}-#{title}"
end
end
link_to
helper gebruiken worden er automatisch al vriendelijke URL’s gegenereerd.
## Genereerd: <a href="/articles/show/324-my-first-article">my first article</a>
link_to article.title, { :controller => 'articles', :action => 'show', :id => article }
params[:id]
zal alleen het id, 324, bevatten onafhankelijk van de rest van de URL.
Dus wanneer een gebruiker de titel van het artikel aanpast van ‘my first article’ naar ‘my first edited article’, blijft de URL ‘/articles/show/324-my-first-article
’ nog steed geldig, er wordt niet eens naar de URL achter het id gekeken, dus /articles/show/324-yadda-yadda
zou nog steeds naar het (inmiddels aangepaste) artikel wijzen.
Leuke oplossing! Wat wij doen bij HollandOnRails is een extra parameter toevoegen. /artikel/lees/143/Dit-is-een-leuk-artikel. In dit geval kan je gewoon op de normale manier werken maar toont het wel chique. Je kan nu uiteraard ook /artikel/lees/143/Nep-titel doen maar dat maakt voor de werking niets uit..
Dit werkt niet met SQLite, Om die reden gebruik ik liever de oplossing van Chris: /artikel/lees/143/Dit-is-een-leuk-artikel
@Justin: Bedankt voor je reactie, de magic gebeurd inderdaad in de database zelf, dit gaat goed in MySQL, maar in SQLite inderdaad niet.