web-dev-qa-db-fra.com

Génération de flux RSS dans Rails 3

Je cherche une meilleure pratique/modèle standard pour générer des aliments dans Rails 3. est http://railcastss.com/episodes/87-generating-rss-feeds toujours valide?

51
Jeppe Liisberg

Tout d'abord, maintenant , je recommande d'utiliser un ATOM Feed au lieu de RSS .

La spécification de ATOM Feed offre plus de valeur que le RSS avec l'internationalisation, les types de contenu et autres choses et Chaque lecteur d'alimentation moderne prend en charge.

Plus d'infos sur ATOM VS RSS se trouve à l'adresse suivante:


sur le codage:

Cet exemple suppose:

  • un modèle appelé NewsItem avec les attributs suivants:
    • title
    • content
    • author_name
  • un contrôleur pour ce modèle (news_items_controller.rb), auquel vous ajouterez l'action feed

Nous utiliserons un modèle de constructeur pour cela et le Ruby ON Rails Atom_feed Helper qui est de grande utilisation.

1. Ajoutez l'action au contrôleur

Aller à app/controllers/news_items_controller.rb et ajouter:

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. Configurez votre modèle de constructeur

Ajoutons maintenant le modèle pour construire le flux.

Aller à app/views/news_items/feed.atom.builder et ajouter:

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. Câbler avec un itinéraire

Faisons les flux disponibles à http:/domain.com/feed

Cela appellera l'action avec le fichier ATOM au format par défaut et rediriger /feed.rss à /feed.atom.

Aller à config/routes.rb et ajouter:

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

4. Ajoutez le lien à ATOM et flux RSS sur la mise en page

Enfin, tout ce qui reste est d'ajouter le flux à la disposition.

Aller à app/views/layouts/application.html.erb et ajoutez ceci votre <head></head> section:

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

Il peut y avoir une faute de frappe ou deux dans ce cas, alors faites-moi savoir si cela fonctionne pour vous.

113
tomeduarte

J'ai fait quelque chose de similaire mais sans créer une nouvelle action.

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

Vous n'avez pas besoin de faire quelque chose de spécial dans le contrôleur, à moins que vous n'ayez du code spécial comme je l'ai fait. Par exemple, j'utilise la gemme Will_paginate et pour l'aliment atom, je ne veux pas qu'il pagine, je l'ai donc fait pour éviter cela.

manette

  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
10
holden