経緯

マスター管理された文字列でシステムを切り分けたいことがあると思います。
例えば、Categoryモデルの名前(slugと呼ぶことにします)を用いてURLを/:slug/postsといったものにしたい時に、これだけであれば、routes.rbの設定は以下のもので十分です。

match '/:slug/posts', to: 'posts#index', via: 'get'

しかし、これが多くなりすぎた時は、

match '/:slug/posts', to: 'posts#index', via: :get
match '/:slug/posts/:id', to: 'posts#show', via: :get
match '/:slug/posts/new', to: 'posts#new', via: :get
match '/:slug/posts', to: 'posts#create', via: :post
match '/:slug/posts/:id', to: 'posts#destroy', via: :delete

のように冗長になってしまいます。

それを完結に書くための方法をご紹介します。

方法

以下のようにscopeでくくってやればOKです。

scope '/:slug' do
  resources :posts, only: [:index, :show, :new, :create, :destroy]
end

あとはscopeの中に通常通りのroutingの設定を書いていけば、頭に/:slugがついて、controller内でparams[:slug]として呼び出すことができます。

まとめ

特にRoutingは明快でメンテナンスしやすいコードにしてやるのが得策だと思います。