RSS et Rails

2009-08-20 18:17:44 UTC

Black Sabbath, Technical Ecstasy

On dit que le cordonnier est souvent mal chaussé. C'est un concept qui se reflète aussi sur le métier de développement et de programmation ; J'ai finalement décidé d'implémenter un fil RSS chez Maxula, et comme vous allez le voir, il suffit de 5 minutes de concentration pour balancer du RSS partout dans un site, un site sous RoR bien sûr.

Rails nous permet d'avoir differents types de sortie avec le même contenu, que ce soit du html, du xml, du json, .... l'avantage du MVC.
Avant l'arrivée de Rails 2.0, il fallait orienter le controlleur vers la vue adéquate avec la fonction respond_to, voici à quoi ça ressemble au niveau du controlleur

def index
  @posts = Post.find(:all)
  
  respond_to do |format|
      format.html
      format.xml { render :xml => @posts}
  end
  
end

Avec Rails 2.0 on pose uniquement l'instance à placer dans la vue, ça se simplifie et ça devient

def index
  @posts = Post.find(:all)
end

Tout se joue au niveau des vues. Vous avez compris!, il y aura une vue pour la sortie html classique et une autre vue pour le RSS. Voici un aspect de l'arborescence sous la vue

RSS arborescence

Quand on lance la requête www.monsiteweb.com/posts/index.rss avec l'extension .rss on appelle la vue correspondante.

Maintenant on va aborder la partie la plus difficile, voyons à quoi ressemble le contenu de la vue RSS : le fichier app/views/posts/index.rss.builder

xml.instruct! :xml, :version =>"1.0"
xml.rss :version => "2.0" do
    xml.channel do
    xml.title "Articles"
    xml.description "Ensemble des Articles"
    xml.link formatted_posts_url(:rss)
    
    for post in @posts
      xml.item do
        xml.title post.title
        xml.description post.short
        xml.pubDate post.created_at.to_s(:rfc822)
        xml.link post_url(post)
     end
    end
  end
end

La première partie du code concerne l'en-tête du fichier XML, le RSS quoi !. La deuxième c'est une boucle pour lire les données de l'instance envoyée du controleur. Voici ce que ça donne à la sortie, de suite il n'y a plus grand chose à expliquer.

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Articles</title>
    <description>Ensemble des Articles</description>
    <link>http://maxula.net/posts.rss</link>
    <item>
      <title>BrowserCMS</title>
      <description>Un autre CMS sous Ruby on Rails.</description>
      <pubDate>Thu, 30 Jul 2009 10:20:22 +0000</pubDate>
      <link>http://maxula.net/posts/browsercms</link>
    </item>
    <item>
      <title>Comatose</title>
      <description>un CMS minimaliste, tr&#232;s souple</description>
      <pubDate>Wed, 12 Aug 2009 00:55:29 +0000</pubDate>
      <link>http://maxula.net/posts/Comatose-CMS</link>
    </item>
    ...
    ...
    ...
  </channel>

</rss>

Je recommande d'utiliser l'attribut updated_at et non le created_at dans la génération du XML, le lecteur de flux RSS détectera automatiquement une mise à jour.


xml.pubDate post.updated_at.to_s(:rfc822)

De nouveau on observe la puissance de l'architecture REST, le lien qui pointe vers la vue RSS est formatted_posts_url(:rss)

Le code simplifié pour attacher le lien à l'icone du fil RSS aura l'aspect suivant:


<%= link_to (image_tag("rss.gif"), formatted_posts_url(:rss) ) %>

On va rajouter une dernière chose pour être dans les normes d'accessibilité surtout pour les navigateurs qui ont leur propre lecteur de flux RSS; une ligne de code à l'en-tête du fichier HTML, entre les balises HEAD du Layout. Il s'agit du fichier app/views/layouts/applications.html.erb par défaut et cette ligne sera la suivante:


<link href="/posts.rss" rel="alternate" title="RSS" type="application/rss+xml" />

Façon Rails ça ressemble plutôt à ça:


<%= auto_discovery_link_tag :rss, formatted_posts_path(:rss) %>

Cette ligne permet d'afficher un raccourci pour le RSS dans la barre d'adresse du navigateur.

La Classe Builder:XMLMarkup de l'ActiveSupport, nous à facilité la vie pour générer la structure du code XML et la puissance du concept REST, nous à facilité la création des liens pour chaque vue. Il y a de quoi méditer sur cet exemple, pour générer des vues plus complexes dans d'autres formats sans limites, bonne méditation !

2 Commentaires :


newbie
2009-11-09 21:41:19 UTC

Arf j'ai un pb avec tout ça apparement. Tu peux me montrer dans ton fichier routes.rb comment tu as définie formatted_posts_path(:rss) ?

Maxula
2009-11-25 17:30:40 UTC

Tout d'abord, désolé pour le retard de réponse. En utilisant Rails 2.x il n'y a rien de tel dans le routes.rb il n'y a que ça "map.resources :posts, :has_many => :comments" Mais je pense qu'entre temps, t'as déjà résolu ton problème

Ajouter un Commentaire

Auteur

Commentaire

-->