トップ «前の日記(2007-02-26 (月)) 最新 次の日記(2007-02-28 (水))»  

まちゅダイアリー


2007-02-27 (火)

地名しりとりにフィードをつけた (FeedTools)

地名しりとり履歴を見ていると、知らない地名が出てきて面白い。

  • 土々呂町 (ととろまち) ← トトロの町!?
  • 十年明 (じゅうねんみょう)
  • 志布志市 (しぶしし)

RSS リーダーで履歴が見れたほうが便利だと思った。 ちょうど、 Rails 勉強会で「フィードとキャッシュ」のセッションに出たので、 そこで紹介された FeedTools を使ってみることにした。

インストール

RubyGems 一発。関連するパッケージもインストールされた気がする。

$ sudo gem install -r feedtools

しりとりエンジンの改造

FeedTools の使い方は簡単。 かなり直感的に書けた。

まずは History モデルに feed クラスメソッドを追加。

Index: app/models/history.rb
===================================================================
--- app/models/history.rb (リビジョン 9)
+++ app/models/history.rb (作業コピー)
@@ -1,3 +1,6 @@
+require 'rubygems'
+require 'feed_tools'
+
 # しりとりのための基本文字列の拡張
 class String
   # 文字列の先頭の1文字を返す(マルチバイト対応)
@@ -77,4 +80,24 @@
       area.save
     end
   end
+
+  def self.feed
+    feed = FeedTools::Feed.new
+    feed.title = "地名しりとり"
+    feed.subtitle = "地名しりとりに追加された地名"
+    feed.author.name = "capping.machu.jp"
+    feed.link = "http://capping.machu.jp/"
+
+    histories = find(:all, :include => :area, :order => 'histories.id DESC', :limit => 20)
+    feed.updated = histories[0].created_on
+    histories.each do |history|
+      item = FeedTools::FeedItem.new
+      item.title = history.area.name
+      item.link = "http://capping.machu.jp/"
+      item.content = "#{history.area.name} (#{history.area.syllabary}) #{history.area.full_name}"
+      item.updated = history.created_on
+      feed.entries << item
+    end
+    feed.build_xml("atom", 1.0)
+  end
 end

ソースの解説は多分いらないと思う。最近の20件の履歴を FeedItem として登録して、最後に build_xml を実行するだけ。 次にコントローラにアクションを追加する。

Index: app/controllers/histories_controller.rb
===================================================================
--- app/controllers/histories_controller.rb (リビジョン 9)
+++ app/controllers/histories_controller.rb (作業コピー)
@@ -69,4 +69,9 @@
     expire_action :action => 'history'
     redirect_to :action => 'index'
   end
+
+  def feed
+    headers['Content-Type'] = 'text/xml;charset=utf-8'
+    render(:text => History.feed)
+  end
 end

headers を使って、出力時の Content-Type を変えている(デフォルトでは text/html になるため)。 最後にビューに Auto Discovery を追加する。

Index: views/histories/index.rhtml
===================================================================
--- views/histories/index.rhtml (リビジョン 9)
+++ views/histories/index.rhtml (作業コピー)
@@ -6,6 +6,7 @@
 <title>地名しりとり</title>
 <link href="http://www.google.com/uds/css/gsearch.css" rel="stylesheet" type="text/css"/>
 <link href="/stylesheets/capping.css" rel="stylesheet" type="text/css"/>
+<link rel="alternate" type="application/rss+xml" title="RSS" href="/histories/feed">
 <script type="text/javascript" src="/javascripts/prototype.js"></script>
 <script src="http://maps.google.co.jp/maps?file=api&amp;v=2&amp;key=<%=h GOOGLE_MAPS_API_KEY %>" type="text/javascript"></script>
 <script src="http://www.google.com/uds/api?file=uds.js&amp;v=1.0&amp;key=<%=h GOOGLE_AJAX_SEARCH_API_KEY %>" type="text/javascript"></script>

これだけでおしまい。地名しりとりのサイトにアクセスしたら、ちゃんとフィードアイコンが表示されるようになった。 簡単だった。

Tags: Rails capping

でも一部動かない (FeedTools)

時間が無いのでメモだけ。

feed の生成に時間がかかる

4.4秒って…。FeedToolsの使い方が悪いのか、そういうものなのか…。

Processing HistoriesController#feed (for XXXXX at 2007-02-27 08:36:02) [GET]
  Parameters: {"action"=>"feed", "controller"=>"histories"}
Completed in 4.44582 (0 reqs/sec) | Rendering: 0.00008 (0%) | DB: 0.00038 (0%) | 200 OK [http://capping.machu.jp/histories/feed]

一応、キャッシュしているから何とかなると思うけど。

キャッシュが有効だとヘッダの Content/Type が書き換わらない
$ wget -S http://capping.machu.jp/histories/feed 
 4 Content-Type: text/xml;charset=utf-8
$ wget -S http://capping.machu.jp/histories/feed
 4 Content-Type: text/html

一回目(キャッシュなし)は書き換わるのに、二回目(キャッシュあり)は text/html になってしまっている。 アクションキャッシュだから、アクションメソッド内で headers を設定しているのが原因だと思って、フィルタに変えてみたけど状況は変わらず…ううん。

Tags: Rails capping