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.

Perry the Platypus wants you to subscribe now! Even if you don't visit my site on a regular basis, you can get the latest posts delivered to you for free via Email: