Railsのroutes.rbでscopeとpathが便利だった
なんか日本語が不自由な感じ。。
Railsのroutes.rbで普通にresource(s)を使う場合はidを使ったURLルートが作られる。
resource 'foo' do resources 'bars' end # bundle exec routes GET /foo/:foo_id/bars(.:format) bars#index POST /foo/:foo_id/bars(.:format) bars#create GET /foo/:foo_id/bars/new(.:format) bars#new GET /foo/:foo_id/bars/:id/edit(.:format) bars#edit GET /foo/:foo_id/bars/:id(.:format) bars#show PATCH /foo/:foo_id/bars/:id(.:format) bars#update PUT /foo/:foo_id/bars/:id(.:format) bars#update DELETE /foo/:foo_id/bars/:id(.:format) bars#destroy POST /foo(.:format) foo#create GET /foo/new(.:format) foo#new GET /foo/:id/edit(.:format) foo#edit GET /foo/:id(.:format) foo#show PATCH /foo/:id(.:format) foo#update PUT /foo/:id(.:format) foo#update DELETE /foo/:id(.:format) foo#destroy
でもidを見せたくなくて、ランダムなトークンでアクセスURLを作りたいとき。
「/foo/:id」ではなくて「/:token」、「/foo/:foo_id/bars」ではなくて「/:token/bars」でアクセスさせたい。
そういうときはscopeとpathを使うとスッキリ書ける。
scope ':token', :token => /\w{8}/ do resource 'foo', :path => '/' do resources 'bars' end end # bundle exec rake routes GET /:token/bars(.:format) bars#index {:token=>/\w{8}/} POST /:token/bars(.:format) bars#create {:token=>/\w{8}/} GET /:token/bars/new(.:format) bars#new {:token=>/\w{8}/} GET /:token/bars/:id/edit(.:format) bars#edit {:token=>/\w{8}/} GET /:token/bars/:id(.:format) bars#show {:token=>/\w{8}/} PATCH /:token/bars/:id(.:format) bars#update {:token=>/\w{8}/} PUT /:token/bars/:id(.:format) bars#update {:token=>/\w{8}/} DELETE /:token/bars/:id(.:format) bars#destroy {:token=>/\w{8}/} POST /:token(.:format) foo#create {:token=>/\w{8}/} GET /:token/new(.:format) foo#new {:token=>/\w{8}/} GET /:token/edit(.:format) foo#edit {:token=>/\w{8}/} GET /:token(.:format) foo#show {:token=>/\w{8}/} PATCH /:token(.:format) foo#update {:token=>/\w{8}/} PUT /:token(.:format) foo#update {:token=>/\w{8}/} DELETE /:token(.:format) foo#destroy {:token=>/\w{8}/}
あとは必要に応じて:onlyと:exceptでアクションを絞るだけ。