Head First Rails 8章 『アクション「news」を作成する』 のルートについて

O’Reilly の Head First Rails の8章 『アクション「news」を作成する』 (p345) で記述されているルートを設定して news.xml を表示させると、ActiveRecord::RecordNotFound in IncidentsController#show という風に show メソッドを実行しようとしてエラーとなってしまう。

調べてみると、このようなフォーラム "Error with chapter 8 files – O’Reilly Forums" があった。
config/routes.rb の最初の方にある map.resources :incidents を追加したルートの後に記述するといいらしい。

ActionController::Routing::Routes.draw do |map|
  # この設定を、追加するルートの後に記述するよう修正する
  # map.resources :incidents

  #...省略...#

  # 追加するルート
  map.connect '/incidents/news', :action=>'news', :controller=>'incidents', :format=>'xml'
  # ここに記述する
  map.resources :incidents
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

ところが、この設定にしても show メソッドを実行しようとしてしまう。

さらに調べてみると、このような記事が、"www.gnnk.net – [Rails][本]Head First Rails"。

そこで、ルート設定のパスに .xml の拡張子を含む形で記述してみる。

ActionController::Routing::Routes.draw do |map|
  # この設定を、追加するルートの後に記述するよう修正する
  # map.resources :incidents

  #...省略...#

  # 追加するルート(news.xmlとする)
  map.connect '/incidents/news.xml', :action=>'news', :controller=>'incidents', :format=>'xml'
  # ここに記述する
  map.resources :incidents
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

すると、この2つの修正で news.xml が表示されるようになった。

使用している ruby, rails, gem のバージョンは以下のとおり。

$ ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin10]
$ rails -v
Rails 2.3.5
$ gem -v
1.3.4

それにしても、フォーラムでもコメントされてるけど、どうして flight の場合は問題なく動作して incident の場合はダメなんだろう…

追記:p353 の auto_discovery_link_tag ヘルパーによる RSS フィードの追加にも修正が必要だった。本文のコードではフィードの URI に .xml の拡張子が付かないので、以下のように :format を指定するコードを追加した。

<%= auto_discovery_link_tag(:rss, {:action=>'news', :format=>'xml'}) %>
Head First Rails ―頭とからだで覚えるRailsの基本
David Griffiths
オライリージャパン
売り上げランキング: 45786
«
»