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?
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:
NewsItem
avec les attributs suivants: title
content
author_name
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.
J'ai fait quelque chose de similaire mais sans créer une nouvelle action.
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.
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