在 Rails 3 中生成 RSS 提要

Posted

技术标签:

【中文标题】在 Rails 3 中生成 RSS 提要【英文标题】:Generating RSS feed in Rails 3 【发布时间】:2011-06-17 04:01:31 【问题描述】:

我正在寻找在 Rails 3 中生成提要的最佳实践/标准模式。http://railscasts.com/episodes/87-generating-rss-feeds 仍然有效吗?

【问题讨论】:

【参考方案1】:

首先,现在我建议使用 ATOM 提要而不是 RSS

ATOM 提要规范在国际化、内容类型和其他方面提供了比 RSS 更多的价值并且每个现代提要阅读器都支持它。

有关 ATOM 与 RSS 的更多信息,请访问:

Wikipedia ATOM entry PRO Blogger 和 Free Marketing Zone 关于该主题的博文

开始编码:

这个例子假设:

名为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。设置您的构建器模板

现在让我们添加模板来构建提要。

转到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 重定向到/feed.atom

转到config/routes.rb 并添加:

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

4.在布局中添加指向 ATOM 和 RSS 提要的链接

最后,剩下的就是将提要添加到布局中。

转到app/views/layouts/application.html.erb 并将其添加到您的<head></head> 部分:

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

其中可能有一两个错字,所以请告诉我这是否适合您。

【讨论】:

为了给予应有的荣誉,这是我根据这篇博文及其 cmets 所做和使用的一个实现:lindsaar.net/2010/2/12/… @holden - 因为我喜欢重用代码并将其用作多个项目的模块。这样,如果我想更改某些内容,这是一次性更改,并且不会影响索引操作逻辑(例如,像您在答案中所做的那样禁用提要格式的分页)。个人喜好,恕我直言。 @tomeduarte:有史以来最好的答案 @tomeduarte 不错的答案,但我认为根据您建议的路线,您提供的 auto_discovery_link_tag 是不正确的。它们确实应该是“/feed”和“/feed.rss”。我知道你说过可能有错别字,所以我确定这只是一个疏忽。 :-) 如果我想为文章显示图片,我该如何传递图片条目。【参考方案2】:

我做了类似的事情,但没有创建新动作。

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 提要,我不希望它分页,所以我这样做是为了避免这种情况。

控制器

  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

【讨论】:

您的示例看起来非常简单 - 只是这 2 个步骤可以让 atom feed 正常工作还是还有更多? @ubique:出于好奇,我只是在我的一个控制器上玩过这个。它使用新的 Rail 3 格式,所以我所要做的就是将 :atom 添加到我的 response_to 哈希中——我什至不必触摸 response_with。 Rails 自动找到了 index.atom.builder,无需对控制器进行进一步修改。来自 php 的背景给我留下了深刻的印象! 如果我想为文章显示图片,我该如何传递图片条目。

以上是关于在 Rails 3 中生成 RSS 提要的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以不在 Rails 中生成迁移文件

“$ rails generate model Model”在Rails 5中生成了两个模型

在 Ruby/Rails 中解析 A​​tom 和 RSS?

如何在 Ruby-on-Rails 中生成 PDF 表单

TFS 签入 RSS 提要

为 iOS 应用程序生成 youtube 播放列表 rss 提要的最佳方法是啥?