Changer le format d'URL d'un blog sous Typo

Pour des raisons historiques, les URL des billets de Typo, le blogware en Ruby on Rails, sont obligatoirement au format /annee/mois/jour/titre-du-billet. Pour mémoire, cette limitation est due à l’introduction dans la version 4.1 de l’application du module datestamped resources. Ce dernier permet de définir une ressource – par exemple un billet – à partir de sa date de création. Si cela a du sens sur un outil de blog, notamment pour éviter de “perdre” deux billets ayant le même titre, c’est également contraignant quand on souhaite personnaliser le format de ses URL.
Ce n’est pourtant pas impossible en modifiant quelques lignes du code de Typo, afin d’accepter les URL du type /titre-de-votre-billet. La suite en images, et le patch qui va bien pour la 5.1.3 à la fin.

Ajouter les routes qui vont bien

On va commencer par modifier le système de routes dans le fichier config/routes.rb afin de prendre en compte les URL du type /titre-du-billet. Ça se passe ligne 110, juste après le commentaire “Allow neat perma URL”, il faut ajouter les lignes suivantes :

map.connect ':title',
  :controller => 'articles', :action => 'show'

map.connect ':title' + '.rss',
    :controller => 'articles', :action => 'show', :format => 'rss'

map.connect ':title' + '.atom',
    :controller => 'articles', :action => 'show', :format => 'atom'

Retrouver nos petits

On va maintenant modifier le modèle Article afin de prendre en compte ce nouveau lien permanent. L’idée originale est d’Éric Daspet, adaptée par mes soins. On va remplacer la méthode findbypermalink dans app/model/article.rb par celle-ci :

def self.find_by_permalink(year, month=nil, day=nil, title=nil)
  unless month
    case year
    when String
      title = year
      year = nil
    when Hash
      year, month, day, title = date_from(year)
    when Array
      year, month, day, title = year
    end
  end
  conditions = ['permalink = ?', title]
  if year
    from, to = self.time_delta(year, month, day)
    conditions[0] += 'AND published_at BETWEEN ? AND ?'
    conditions += self.time_delta(year, month, day)
  end
  
  find_published(:first,
                 :conditions => conditions) \
    or raise ActiveRecord::RecordNotFound
end

Voilà, c’est presque fini. Il ne nous reste plus qu’à modifier le helper linktopermalink qui génère les liens permanents dans les vues afin de prendre ces modifications en compte. Ça se passe cette fois dans app/helpers/application_helper.rb ligne 17.

Remplacez la ligne :

"<a href=\"#{article_path(item)}#{anchor}\" class=\"#{style}\">#{title}</a>"

Par :

"<a href=\"#{this_blog.base_url}#{item.permalink}#{anchor}\" class=\"#{style}\">#{title}</a>"

Et voilà, c’est terminé. Pas besoin de modifier votre thème, tout est sensé fonctionner out of the box. Et pour les feignants du copier / coller, vous pouvez utiliser le patch gracieusement fourni en pìece jointe.

Publié le 25 septembre 2008 à 19h08 Publié sous et Labels blogging, ruby, rails, rubyonrails

À propos

Frédéric de Villamil

Je m'appelle Frédéric de Villamil, et quand je ne déploie pas ma mauvaise humeur et ma mauvaise foi sur le Web, je suis un super héros chargé de sauver le monde. Vous pouvez me suivre sur Twitter.

  1. pouype le 26 septembre 2008 à 07h42

    Merci Frederic !

    J’ai quand même un peu la honte, là (Comprenne qui pourra)

  2. Frédéric de Villamil le 26 septembre 2008 à 10h41

    Tu peux oui ;-)

    (moi j’ai compris)

Réagir à Changer le format d'URL d'un blog sous Typo

Afin de maintenir le niveau global de ce site, les commentaires font l'objet d'une politique de modération qualitative basée sur des critères non écrits et totalement subjectifs, donc injustes.

Les commentaires écrits en langage SMS, inutiles, déplacés, injurieux ou relevant du spam seront systématiquement supprimés sans avertissement préalable.

Les trackbacks sont fermés pour cause de spam.