RailsでRSSフィードを作成する:builder
Railsでbuilderを使ってRSSフィードを追加するためのメモです。
要件
- Gemを追加しない
- ルーティングを指定できる
- 動的に更新できる
最終的には、http://example.com/feed/でRSSフィードを提供することが目的です。
今回は、上記の要件を満たすためにbuilderを使ってRSSフィードを作成しました。
参照: Builder::XmlMarkup - APIdock
ルーティング:routes.rb
routes.rbにルーティングを記載します。このとき、デフォルトのフォーマットを指定するのを忘れないようにしてください。
get :feed, to: 'rss#index', defaults: { format: :rss }
コントローラー:rss_controller.rb
コントローラー側ではあまりやることはなく、@postsを取得するのみです。
atomなどフォーマット毎に、RSSを提供する場合はrespond_toを使って指定します。
class RssController < ApplicationController layout false def index @posts = Post.published.limit(10) respond_to do |format| format.rss format.atom end end end
ビュー:index.rss.builder
appview/rss
にindex.rss.builderを作成します。
xml.instruct! :xml, :version => "1.0" xml.rss( "version" => "2.0", "xmlns:content" => "http://purl.org/rss/1.0/modules/content/", "xmlns:wfw" => "http://wellformedweb.org/CommentAPI/", "xmlns:dc" => "http://purl.org/dc/elements/1.1/", "xmlns:atom" => "http://www.w3.org/2005/Atom", "xmlns:sy" => "http://purl.org/rss/1.0/modules/syndication/", "xmlns:slash" => "http://purl.org/rss/1.0/modules/slash/" ) do xml.channel do xml.title "サイト名" xml.description "説明" xml.link "サイトURL" xml.language "ja-ja" xml.ttl "40" xml.pubDate(Time.now.strftime("%a, %d %b %Y %H:%M:%S %Z")) xml.atom :link, "href" => "RSSのURL", "rel" => "self", "type" => "application/rss+xml" @posts.each do |p| xml.item do xml.title p.title #タイトル xml.description do xml.cdata! strip_tags(p.content)[0..110] #本文 end xml.pubDate p.created_at #公開日 xml.guid "http://example.com/#{p.id}" xml.link "http://example.com/#{p.id}" end end end end
これで完了です。