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)))'