Rails 3. Is http://railscasts.com/episodes/87-generatingでフィードを生成するためのベストプラクティス/標準パターンを探しています。 -rss-feeds はまだ有効ですか?
まず第一に、今日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" %>
その中にタイプミスがあるかもしれないので、これがあなたのために働くかどうか私に知らせてください。
私は同じようなことをしましたが、新しいアクションを作成しませんでした。
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