Я ищу образец лучшей практики/стандартного шаблона для создания фидов в Rails 3. Является ли http://railscasts.com/episodes/87-generating-rss-feeds?
Создание RSS-ленты в Rails 3
Ответ 1
Прежде всего, в настоящее время я рекомендую использовать фид ATOM вместо RSS.
Спецификация фида ATOM дает больше значения, чем RSS, с интернационализацией, типами контента и другими вещами, и каждый современный читатель каналов поддерживает его.
Более подробную информацию о ATOM vs RSS можно найти по адресу:
- Запись в Wikipedia ATOM
- PRO Blogger и Свободная зона маркетинга в блогах о тема
К кодированию:
В этом примере предполагается:
- модель под названием
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 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" %>
В этом может быть опечатка или две, поэтому дайте мне знать, если это сработает для вас.
Ответ 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, и для подачи атома я не хочу, чтобы он разбивался на страницы, поэтому я сделал это, чтобы этого избежать.
контроллер
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