Rails で RSS を出力するにはどうすれば良いのか調べてみたが、標準で搭載されている Builder 機能を利用するのが楽っぽかったので試してみた。
ググって出てくる情報だと拡張子によって表示の出し分けを行うものが多かったのだが WordPress みたいに拡張子無しの /feed で RSS を表示するには, controller で respond_to を使用せず以下のように直接 render メソッドを呼ぶとできた。
class ArticlesController < ApplicationController
def index
end
def feed
@entries = Article.order('id desc').limit(10)
render 'feed.rss.builder'
end
end
これにあわせてルーティングを記述する
# config/routes.rb
match 'feed' => 'article#feed', via: 'get', :as => 'feed'
feed.rss.builder は以下のような感じ。
cache_key = 'feed_cache_key_' + request.url
cache cache_key, expires_in: 30.minutes do
xml.instruct! :xml, :version => 1.0
xml.rss(version: '2.0') do
xml.channel do
xml.title @title
xml.link @url
xml.description ''
xml.lastBuildDate Time.zone.now.to_s(:rfc822)
@articles.each do |article|
xml.item do
xml.title article.title
xml.link article.url
xml.guid article.url
xml.description do
xml.cdata! article.description
end
xml.pubData article.created_at.to_s(:rfc822)
end
end
end
end
end
ついでにキャッシュも設定してある。更新頻度にもよるがある程度キャッシュしておけばサーバーの負荷を軽減できる。
このような感じに実装すれば /feed にアクセスすれば RSS が表示されるはずだ。