Hatena::ブログ(Diary)

このブログは証明できない。

2007-12-03

[]RailsRSSフィードを配信するのは超簡単!

viewで.rhtmlの代わりに.rxmlを使うだけ。サンプルは「Rails Cookbook」より。一部変更している箇所にはコメントを入れています。


まずは、app/controllers/xml_controller.rb。普通に作ります。

class XmlController < ApplicationController
  def rss
    @feed_title = "O'Reilly Books"
    @books = Book.find(:all, :order => "est_release_date desc", :limit => 2)
    # app/view/layout/application.rhtmlがあるとまずいので
    render :layout => false
  end
end

次に、app/views/xml/rss.rxml。拡張子が.rhtmlではなく、.rxmlです。

xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8"
xml.rss('version' => '2.0') do
  xml.channel do
    xml.title @feed_title
    xml.link(request.protocol + request.host_with_port + url_for(:rss => nil))
    xml.description(@feed_title)
    # オリジナルは "en-us"
    xml.language "jp-jp"
    xml.ttl "40"
    # RFC-822 datetime example: Tue, 10 Jun 2003 04:00:00 GMT
    xml.pubDate(Time.now.strftime("%a, %d %b %Y %H:%M:%S %Z"))
    @books.each do |b|
      xml.item do
        xml.title(b.title)
        xml.link(request.protocol + request.host_with_port +
                 url_for(:controller => 'posts', :action => 'show', :id => b.id))
        xml.description(b.sales_pitch)
        xml.guid(request.protocol + request.host_with_port +
                 url_for(:controller => 'posts', :action => 'show', :id => b.id))
      end
    end
  end
end

あとは、リンクを貼っておくといいでしょう。

<%= link_to 'RSS' :controller => 'xml', :action => 'rss' %>

RSSフィードを配信しているサイトにアクセスすると、ブラウザRSSアイコンが表示されますよね。RSS Auto-discoveryという機能を使っています。RSS Auto-discoveryを使うにはHTMLのhead部分にタグを追加します。app/view/layout/application.rhtmlなど好きなところに。

<head>
  <link rel="alternate" type="application/rss+xml" title="RSS"
    href="<%= request.protocol + request.host_with_port + url_for(:controller => 'xml', :action => 'rss') %>" />
<head>

Rails Cookbook」って、日本語版は出版されていないようですね。

Rails Cookbook (Cookbooks (O'reilly))

Rails Cookbook (Cookbooks (O'reilly))

なまえなまえ 2008/07/16 23:48 理解するのに5時間かかりました。
超簡単でした!

MillyCMillyC 2008/08/29 15:34 s/RFC-882/RFC-822/ だと思います。

shunsukshunsuk 2008/08/29 20:59 ありがとうございます!
確認しましたが、その通りでした。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証