Penere adresser

Selv om navlebeskuelse ikke er det mest tiltalende man kan gjøre på web er jo dette tross alt en teknologiblogg. Vi har idag gjort litt om på URLene her på nettstedet.

For å score sånn noenlunde på søkbarhet er ett av kriteriene at URLen gjenspeiler innholdet i artikkelen. Når man bygger en blogg i Rails fra grunnen av, slik vi har gjort med denne bloggen, er minste motstands vei å bruke den unike ID’en til en artikkel som basis for URLen til den. Fram til nå nettopp var adressene til artikler på denne bloggen nettopp slik:

http://shortcut.no/posts/1

Nå er det antakelig mindre interessant for deg som leser denne bloggen hvilken ID databasen vår tildeler artiklene i bloggen. Det som kanskje er av betydning er tittelen på artikkelen og når artikkelen ble skrevet. En veldig vanlig måte å gjøre dette på er å bruke Permalinker, der både dato og tittelen til artikkelen vises i URLen.

Vi har implementert permalinker i denne bloggen ved hjelp av et filter i Post-klassen i bloggen, slik:

class Post < ActiveRecord::Base
  before_create :create_permalink
end

Dette filteret gjør noen helt enkle operasjoner:

  • Først erstattes alle norske tegn (æ, Æ, ø, Ø, å, Å) med tilsvarende internasjonale tegn (a, o og a)
  • Deretter gjøres permalinken til små bokstaver
  • Deretter byttes alt som ikke er internasjonale bokstaver eller tall ut med en understrek

Resultatet av denne operasjonen lagres i kolonnen permalink i databasen. Enhetstesten for permalinker ser slik ut:

class PostTest < ActiveSupport::TestCase
  def test_permalinks
    post = @user.posts.new(
      :title => "Godt nyttår fra Østerdalen 123")
    assert post.save
    assert_equal(
      "godt_nyttar_fra_osterdalen_123", 
      post.permalink)
  end
end

Vi har valgt å ikke kreve at permalinkene skal være unike, dette ville hindret oss fra å skrive to artikler med samme tittel. Istedet bruker vi routingen i Rails til å sørge for at vi henter riktig artikkel. Linkene til artikler genereres i en helper, slik:

def permalink_to(post, label)
  link_to(label, permalink_url(post))
end

def permalink_url(post)
  url_for(
    :controller => "/posts", 
    :action => "show_permalink", 
    :year => post.created_at.year, 
    :month => post.created_at.month, 
    :day => post.created_at.day, 
    :permalink => post.permalink)
end

Ved å skille dette ut i to metoder kan vi både bruke helperen til å generere en permalink-link som kan brukes for seg selv og en link_to-lignende syntaks. Helperen sørger for å sende med parametre for år, måned og dag artikkelen ble skrevet. For at adressene skal bli formatert riktig lager vi en linje i routes.rb som formaterer dette slik vi er vant med:

  map.permalink '/posts/:year/:month/:day/:permalink', :controller => "posts", :action => "show_permalink" 

Datoen havner nå som henholdsvis params[:year], params[:month], params[:day] og params[:permalink] i PostsController-klassen vår.

No_gravatar

Permalinker er kjempefint og spesielt når man kan demonstrere det slik som du gjør her. - Når det gjelder æøå er disse i dag gyldige linker og vi ønsker å vise disse på en måte som gjør at hvem som helst skal kunne lese disse (spesielt på Google). I norge vil vise de norske tegnene. Kanskje, hvis vi har en internasjonal site, kan det være interessant å redusere omfanget av 8/16 bits tegnsett, Hva med en localized_perma_link … hmmm noe å tenke på for oss web-frelste her i skandinavia.

- knut


Gravatar-aktivert. Les mer om gravatar.
E-postadressen vil ikke vises på siden