web-dev-qa-db-ja.com

Rails 3でRSSフィードを生成する

51
Jeppe Liisberg

まず第一に、今日RSSの代わりにATOMフィードを使用することをお勧めします。

ATOMフィードの仕様は、国際化、コンテンツタイプ、その他およびすべての最新のフィードリーダーがサポートするRSSのものよりも多くの価値を提供します。

ATOM vs RSSに関する詳細情報は、次の場所にあります。


コーディングに:

この例では、次のことを前提としています。

  • 次の属性を持つ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" %>

その中にタイプミスがあるかもしれないので、これがあなたのために働くかどうか私に知らせてください。

113
tomeduarte

私は同じようなことをしましたが、新しいアクションを作成しませんでした。

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