2011-01-28 15 views

Respuesta

114

Antes que nada, hoy en día Recomiendo usar un feed ATOM en lugar de RSS.

La especificación de alimentación ATOM ofrece más valor que el RSS con internacionalización, tipos de contenido y otras cosas y cada lector de alimentación moderna lo admite.

Más información sobre ATOM vs RSS se puede encontrar en:


En la codificación:

este ejemplo se supone:

  • un modelo llamado NewsItem con los siguientes atributos:
    • title
    • content
    • author_name
  • un controlador para que el modelo (news_items_controller.rb), a que agregará el feed ac

Vamos a utilizar una plantilla de generador para este y el Ruby on Rails atom_feed helper que es de gran utilidad.

1. Añadir la acción al controlador

Ir a app/controllers/news_items_controller.rb y añadir:

def feed 
    # this will be the name of the feed displayed on the feed reader 
    @title = "FEED title" 

    # the news items 
    @news_items = NewsItem.order("updated_at desc") 

    # this will be our Feed's update timestamp 
    @updated = @news_items.first.updated_at unless @news_items.empty? 

    respond_to do |format| 
    format.atom { render :layout => false } 

    # we want the RSS feed to redirect permanently to the ATOM feed 
    format.rss { redirect_to feed_path(:format => :atom), :status => :moved_permanently } 
    end 
end 

2. Configuración de la plantilla de constructor

Ahora vamos a añadir la plantilla para construir la alimentación.

Ir a app/views/news_items/feed.atom.builder y añadir:

atom_feed :language => 'en-US' do |feed| 
    feed.title @title 
    feed.updated @updated 

    @news_items.each do |item| 
    next if item.updated_at.blank? 

    feed.entry(item) do |entry| 
     entry.url news_item_url(item) 
     entry.title item.title 
     entry.content item.content, :type => 'html' 

     # the strftime is needed to work with Google Reader. 
     entry.updated(item.updated_at.strftime("%Y-%m-%dT%H:%M:%SZ")) 

     entry.author do |author| 
     author.name entry.author_name 
     end 
    end 
    end 
end 

3. alambre para arriba con una ruta

Vamos a hacer los feeds disponibles en http://domain.com/feed

Esto llamará a la acción con el átomo formatee por defecto y redireccione /feed.rss a /feed.atom.

Ir a config/routes.rb y añadir:

resources :news_items 
match '/feed' => 'news_items#feed', 
     :as => :feed, 
     :defaults => { :format => 'atom' } 

4. Añada el enlace al átomo y RSS en el diseño

Finalmente, todo lo que queda es añadir la alimentación a la disposición .

Ir a app/views/layouts/application.html.erb y añadir esta Sección <head></head>:

<%= auto_discovery_link_tag :atom, "/feed" %> 
<%= auto_discovery_link_tag :rss, "/feed.rss" %> 

Puede haber un error tipográfico o dos en que, por lo que me haga saber si esto funciona para usted.

+1

dar crédito donde es debido, se trata de una aplicación que hice y uso basado de esta entrada del blog y sus comentarios: http://lindsaar.net/2010/2/12/how -to-make-an-rss-feed-or-atom-feed-in-rails – tomeduarte

+0

pero ¿por qué agregar una acción totalmente nueva en lugar de simplemente un nuevo formato para decir la acción de índice? – holden

+2

@holden - porque me gusta reutilizar el código y utilizarlo como módulo en varios proyectos. De esta forma, si quiero cambiar algo, es un cambio de una sola vez y no afecta la lógica de acción del índice (por ejemplo, deshabilitar la paginación para el formato de alimentación como lo hizo en su respuesta). Preferencia personal, ambos son igualmente válidos. – tomeduarte

10

Hice algo similar pero sin crear una nueva acción.

index.atom.builder

atom_feed :language => 'en-US' do |feed| 
    feed.title "Articles" 
    feed.updated Time.now 

    @articles.each do |item| 
    next if item.published_at.blank? 

    feed.entry(item) do |entry| 
     entry.url article_url(item) 
     entry.title item.title 
     entry.content item.content, :type => 'html' 

     # the strftime is needed to work with Google Reader. 
     entry.updated(item.published_at.strftime("%Y-%m-%dT%H:%M:%SZ")) 
     entry.author item.user.handle 
    end 
    end 
end 

No es necesario hacer nada especial en el controlador a menos que tenga algún código especial como lo hice. Por ejemplo, estoy usando la gema will_paginate y para la alimentación del átomo no quiero paginar, así que hice esto para evitar eso.

controlador

def index 
    if current_user && current_user.admin? 
     @articles = Article.paginate :page => params[:page], :order => 'created_at DESC' 
    else 
     respond_to do |format| 
     format.html { @articles = Article.published.paginate :page => params[:page], :order => 'published_at DESC' } 
     format.atom { @articles = Article.published } 
     end 
    end 
    end 
+0

su ejemplo parece bastante sencillo: ¿son solo estos 2 pasos para que la alimentación del átomo funcione o hay más? – ubique

+0

@ubique: Acabo de jugar con esto en uno de mis controladores por curiosidad. Utiliza el nuevo formato de Rail 3, así que todo lo que tuve que hacer fue agregar: átomo a mi respuesta_ a hash - ni siquiera tuve que tocar responder_con. Rails encontró automágicamente el index.atom.builder sin modificaciones adicionales en el controlador. ¡Estoy impresionado de venir de un fondo de PHP! –

+0

¿Qué sucede si quiero mostrar una imagen para el artículo? ¿Cómo paso la entrada de la imagen? – Uchenna

Cuestiones relacionadas