Atom 形式のフィードを簡単に作る

概要

AtomFeedHelper で簡単にフィードを作ります。Rails 2.0.2 で検証。

実装

Rails 2.0 系では、 respond_to を利用して単一のアクションで複数形式による出力を行う事ができます。今回使う atom の他、通常の html や json などが指定可能です。では、 index アクションに複数のフォーマットを割り振りましょう。

def index
  @items = Item.find(:all, :limit => 10, :order => "created_at DESC")
  respond_to do |format|
    format.html
    format.atom do
      render :layout => false
    end
  end
end

レイアウトの指定は、 atom の出力には必要ない(エラーになる)ため行っています。これでコントローラ側の準備は完了。続いて、ビューを作成します。

ビューのファイル名は index.atom.builder です。使うテンプレートが erb ではない事に注意して下さい。ファイルを作成したら、フィードを記述します。

atom_feed(:language => "ja-JP") do |feed|
  feed.title("なんかのさなぎ")
  feed.updated(@items.first.created_at)

  @items.each do |i|
    feed.entry(i) do |entry|
      entry.title(i.title)
      entry.content(i.body, :type => "html")
      entry.author do |a|
        a.name("spitfire_tree")
      end
    end
  end
end

このテンプレートの便利な点は、 updated が自動的に atom の仕様に沿った形になる点や、 CDATA を記述せずとも自動的にエスケープを行ってくれる点などです。また、 id も自動的に割り振ってくれるため、ミスを気にする必要もありません。
注意点としては、デフォルトでは言語指定が en-US になっている事でしょうか。オプションで設定可能なので、日本語の場合は上のサンプルのように指定してください。
ちなみに、通常のビュー同様にヘルパメソッドを利用する事もでき、 Ruby のロジックを埋め込む事も(当たり前ですが)可能です。