在Rails 3中生成RSS feed
我正在寻找在Rails 3中生成Feed的最佳实践/标准模式。http: //railscasts.com/episodes/87-generating-rss-feeds仍然有效吗?
首先,现在我推荐使用ATOM feed而不是RSS 。
ATOM feed的规范比RSS的规范提供更多的价值与国际化,内容types和其他东西,每个现代的饲料读者支持它。
有关ATOM vs RSS的更多信息,请访问:
- 维基百科的ATOM条目
- PRO博客和免费营销区的博客文章关于这个问题
在编码上:
这个例子假设:
- 一个名为
NewsItem
的模型具有以下属性:-
title
-
content
-
author_name
-
- 该模型的控制器(
news_items_controller.rb
),您将为其添加feed
操作
我们将使用一个生成器模板和Ruby on Rails的atom_feed helper ,它非常有用。
1.将操作添加到控制器
转到app/controllers/news_items_controller.rb
并添加:
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.设置您的生成器模板
现在让我们添加模板来构build提要。
转到app/views/news_items/feed.atom.builder
并添加:
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.连接一条路线
让我们在http://domain.com/feed提供这些提要;
这将默认调用ATOM格式的动作,并将/feed.rss
redirect到/feed.atom
。
转到config/routes.rb
并添加:
resources :news_items match '/feed' => 'news_items#feed', :as => :feed, :defaults => { :format => 'atom' }
4.将链接添加到布局上的ATOM和RSS源
最后,剩下的就是添加feed到布局。
转到app/views/layouts/application.html.erb
并添加您的<head></head>
部分:
<%= auto_discovery_link_tag :atom, "/feed" %> <%= auto_discovery_link_tag :rss, "/feed.rss" %>
有可能是一个错字或两个,所以让我知道这是否适合你。
我做了类似的事情,但没有创build一个新的动作。
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
除非你有特殊的代码,否则你不需要在控制器中做任何特殊的事情。 例如,我使用的是will_paginate gem和atom feed,我不希望它分页,所以我这样做是为了避免这种情况。
调节器
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