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

これで完了です。