at posts/single.html

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

地名しりとりにフィードをつける話の続き。 先日の日記で書いたとおり、キャッシュが有効だとヘッダの Content/Type が書き換わらないという問題があった。

フィルタを使ってあれこれ試した結果、 prepend_before_filter を使えばいいという結論になった。 それ以外のフィルタ before_filter, after_filter, prepend_before_filter だと、キャッシュが有効の時にはなぜか実行されない。

という訳で、既存のコントローラを prepend_before_filter を使うように修正した。

Index: app/controllers/histories_controller.rb
===================================================================
--- app/controllers/histories_controller.rb     (リビジョン 12)
+++ app/controllers/histories_controller.rb     (作業コピー)
@@ -7,6 +7,7 @@
          :add_flash => { :notice => '地名を選択してください'},
          :only => [:create]
   caches_action :json, :feed
+  prepend_before_filter :feed_charset, :only => :feed

   # メイン画面を返す。何も処理はしない。
   def index
@@ -71,7 +72,12 @@
   end

   def feed
-    headers['Content-Type'] = 'text/xml;charset=utf-8'
     render(:text => History.feed)
   end
+
+protected
+
+  def feed_charset
+    headers['Content-Type'] = 'text/xml;charset=utf-8'
+  end

ついでに route.rb を修正した。 http://capping.machu.jp/feed.xml でフィードを取得できるようにしている。

Index: config/routes.rb
===================================================================
--- config/routes.rb    (リビジョン 8)
+++ config/routes.rb    (作業コピー)
@@ -12,6 +12,7 @@
   # You can have the root of your site routed by hooking up ''
   # -- just remember to delete public/index.html.
   map.connect '', :controller => "histories"
+  map.connect 'feed.xml', :controller => "histories", :action => 'feed'

   # Allow downloading Web Service WSDL as a file with an extension
   # instead of a file named 'wsdl'
Index: app/views/histories/index.rhtml
===================================================================
--- app/views/histories/index.rhtml     (リビジョン 12)
+++ app/views/histories/index.rhtml     (作業コピー)
@@ -6,7 +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">
+<link rel="alternate" type="application/rss+xml" title="RSS" href="feed.xml">
 <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>

これで livedoor Reader でフィードを拾ってくれるようになるといいな。

追記

なんか拾ってくれているっぽい。

関連する日記