RailsでRESTfulにposts/:year/:month/:dayするにはどうしたらいいんだろう (続き)

前の記事の続き。

id:tkawa さんがコメントで教えてくれてとっくに解決していましたが、

http://api.rubyonrails.org/classes/ActionDispatch/Routing.html
の「Pretty URLs」によると、
match '/articles/:year/:month/:day' => 'articles#find_by_id', :constraints => { ... }
のように書けばいいようです。
routes.rbに「:action」を書いてしまうのがレガシーでRESTfulではないということで、「posts/:year/:month/:day」はRESTfulと言っていいと思いますよ。


この前、Rails3 cheat sheets http://blog.envylabs.com/2010/12/rails-3-cheat-sheets/ にも同じ方法が載っているのを見つけたので改めてまとめておきます。

# これは有効なrouting

# OPTIONAL PARAMETERS
match '/posts(/:yy(/:mm))' => "posts#index"

class PostsController < ApplicationController
  def index
    # params[:yy]
    # params[:mm]
  end
end

# CONSTRAINTS
match '/:year' => "posts#index",
  :constraints => {:year => /\d{4}/, :ip => /192\.168\.1\.\d{1,3}/}

結局、下のコードがLegacyとされているのは、全てのコントローラーがアクセスできるようになってしまう問題があるためで、「RESTfulではないから」と思ったのはただの読み違いだったということでした。

# こっちはLegacyなrouting

# LEGACY ROUTE
match '/:controller(:/:action(/:id(.:format)))'