maehachi08 Anything Blog

2012年08月31日
RailsでRSS配信を実装

xmlコントローラを生成する

別に新しいコントローラでなくてもいいですが、URLの組み立てやすさとかルーティング設定無しのシンプルなRSS配信を実装したいので今回はXMLコントローラを生成します。

# rails g controller xml
      create  app/controllers/xml_controller.rb
      invoke  erb
      create    app/views/xml
      invoke  test_unit
      create    test/functional/xml_controller_test.rb
      invoke  helper
      create    app/helpers/xml_helper.rb
      invoke    test_unit
      create      test/unit/helpers/xml_helper_test.rb

xml_controllerにrssアクションを定義する

アクション(メソッド)名は何でもいいですが、RSS配信URLということが分かるようにしましょう。ここでは、rssという名前でアクションを定義します。
rssアクションでは、RSSで配信したいコンテンツの取得、RSS仕様に基づいた情報をテンプレート変数(@hoge)として定義します。
RSS仕様はググればでてきます

シンプルに書いています。blogテーブルの全レコードを取得してますが、必要に応じて:limit => '5'とか、適宜調整してください。

app/controllers/xml_controller.rbのrssアクションの内容
class XmlController < ApplicationController
  def rss
    @feed_title = "maepachi blog"
    @blogs = Blog.find(:all, :order => "created_at desc")

    render :layout => false

  end
end

RSS配信内容をapp/views/xml/rss.rxmlとして作成する

rssアクション内でrenderメソッドを使用しない限り、拡張子前はアクション名と同じです。拡張子はhtml.erbではなく、rxmlであることに注意しましょう。
記述の説明については私も理解半ばので割愛します。

app/views/xml/rss.rxmlの内容
xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8"
xml.rss("version"    => '2.0',
        "xmlns:dc"   => "http://purl.org/dc/elements/1.1/",
        "xmlns:atom" => "http://www.w3.org/2005/Atom") do
  xml.channel do
    xml.title @feed_title
    xml.link(request.protocol + request.host_with_port + url_for(:rss => nil))
    xml.language "ja-ja"
    xml.ttl "40"
    xml.pubDate(Time.now.strftime("%a, %d %b %Y %H:%M:%S %Z"))

    @blogs.each do |blog|
      xml.item do
        xml.title(blog.title)
        xml.link(request.protocol + request.host_with_port +
                 url_for(:controller => 'blog', :action => 'entry', :id => blog.id ))
        xml.description(blog.body)
        xml.guid(request.protocol + request.host_with_port +
                 url_for(:controller => 'blog', :action => 'entry', :id => blog.id ))
        xml.pubDate(blog.created_at)
        xml.author "RssAuthor"
      end
    end
  end
end

RSSアイコンをサイトに表示させる

RSSフィードのオレンジマークの画像はネット上にたくさんありますのでそれを活用しましょう。
あとは、表示させたい場所(たいていヘッダーかフッターとかでしょうか)にlink_toにimage_tagの組み合わせで表示させます。
以下記述はxmlコントローラのrssアクションへのリンクをapp_root/public/images/rss.jpegとして表示させる記述です。

<%= link_to image_tag('/images/rss.jpeg', { :border => '0',
                                            :alt => 'RSSフェード登録',
                                            :size => '80x50'}),
      { :controller => 'xml', :action => 'rss' } %>

RSS Auto DiscoveryでブラウザにRSS配信を認識させる

『RSS Auto Discovery』とは、RSSリーダやブラウザがサイトを訪れた時に、そのサイトでRSS配信をしていることを自動認識させる仕組みです。
railsアプリでRSS Auto Discoveryを実装する場合、railsメソッドで記述する方法とHTMLタグで記述する方法があります。どちらの記述方法でも、記述する場所はheadタグの中です。

Railsメソッドで記述する場合
<head>
  <%= auto_discovery_link_tag( :rss, "/xml/rss" ) %>
</head>
HTMLタグで記述する場合
<head>
  <link rel="alternate" type="application/rss+xml" title="RSS"
    href="<%= request.protocol + request.host_with_port + url_for(:controller => 'xml', :action => 'rss') %>")
<head>

さぁ、ブラウザでサイトにアクセスしてみてください。URLバーの右側にRSSフィードのマークが表示され、ワンクリックでお使いのRSSフィーダーへの登録が済んだのではないでしょうか。