RSS et Rails
2009-08-20 18:17:44 UTC
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
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è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 :
Ajouter un Commentaire
Auteur
Commentaire


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) ?
Maxula2009-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