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 de to_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
Wanneer we nu 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 }
Het mooie is dat er in de controller niets aangepast hoeft te worden, 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.

Geplaatst in ,  | 3 reacties

Reacties

  1. Chris Obdam zei 1 dag later:

    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..

  2. Justin Halsall zei 3 dagen later:

    Dit werkt niet met SQLite, Om die reden gebruik ik liever de oplossing van Chris: /artikel/lees/143/Dit-is-een-leuk-artikel

  3. Matthijs Langenberg zei 6 dagen later:

    @Justin: Bedankt voor je reactie, de magic gebeurd inderdaad in de database zelf, dit gaat goed in MySQL, maar in SQLite inderdaad niet.

(Laat url/e-mail achter »)

   Voorvertoning