RSS Syndication e Rails
by Juna

Come far sapere al mondo quel che c'è di nuovo

Ci sono un mucchio di modi per far sapere ai propri contatti che qualcosa sul sito è cambiato: si può scrivere sul proprio account di facebook, ci si può affidare alla curiosità dei visitatori più assidui. Oppure si può mettere in piedi un piccolo sistema di syndication RSS.

La prima cosa da fare se si vuole mettere a disposizione un feed delle notizie con Ruby on Rails è…estrarre le notizie. Sembra banale ma è proprio così, è necessario generare un controller che esponga un metodo atto a restituire un oggetto che rappresenta la lista di notizie da condividere:

class FeedController < ApplicationController
def posts
    @posts = Post.find(:all,
      :order => "updated_at DESC, created_at DESC",
      :limit => 10)
    response.headers['Content-type'] = "application/rss+xml"
    respond_to do |format|
      format.xml  { render :layout => false}
    end
  end
end

E’ facile osservare che per generare un feed RSS non c’è bisogno di includere anche il layout della pagina che finirebbe per malformare il suo contenuto.

L’ XML vero e proprio del feed può essere generato in vari modi, uno dei quali coinvolge l’utilizzo di XML Builder e di un template rxml: questo template in particolare deve proprio avere il nome del metodo che fornisce le notizie e deve trovarsi nella cartella della vista associata al controller dei feeds (quindi ad esempio in questo caso si avrebbe “../views/feed/posts.rxml”).

xml.instruct!
xml.rss "version" => "2.0",
  "xmlns:dc" => "http://purl.org/dc/elements/1.1/" do
  xml.channel do
    xml.title 'Digitalwaters.net'
    xml.link url_for(:only_path => false,
      :controller => 'posts' ,
      :action => 'index' )
    xml.pubDate CGI.rfc1123_date(@posts.first.updated_at)
    xml.description h("A blog about coding and creativity.")
    @posts.each do |post|
      xml.item do
        xml.title post.title
        xml.link url_for(:only_path => false,
          :controller => 'posts' ,
          :action => 'show' ,
          :id => post)
        xml.description(RedCloth.new(post.content).to_html)
        xml.pubDate CGI.rfc1123_date(post.updated_at)
        xml.guid url_for(:only_path => false,
          :controller => 'post' ,
          :action => ' show' ,
          :id => post)
        xml.author h(User.find(post.user_id).username)
      end
    end
  end
end

L’oggetto xml che viene messo a disposizione provvede a generare i tag xml conformemente ai parametri che gli vengono forniti.
E’ possibile permettere al browser di riconoscere che si mette a disposizione un feed aggiungendo nel tag del template dell’applicazione la direttiva:

<%= auto_discovery_link_tag(:rss, {:controller => 'feed' , :action => 'posts' }) %>



Bibliografia

Fowler, C. (2006). Rails Recipes(Pragmatic Programmers). Pragmatic Bookshelf.

Category: blog

Tags: ruby rails

Back






Comments