namespaceを利用するメリット
URLを直感的にできる
例えば、自分がいいねしてるユーザー一覧を見せる画面を作るとします。
簡単に作るとするならば、user_controllerにlikingメソッドを作ったりしますが、そうするとできるURlは以下になります。
#ターミナル
liking_users GET /users/liking(.:format) users#liking
ちなみにコードはこんな感じですかね。
routes.rb
Rails.application.routes.draw do
resources :users do
collection do
get :liking
end
end
ただこのコードだとURL内にあるusersって誰やねんとなるので、自分はいつもnamespaceを使ってURLを書き換えています。
routes.rb
namespace :my do
get '/liking', :to => "likes#liking"
end
こうすると、生成されるURLが下記のようになります。
#ターミナル
my_liking GET /my/liking(.:format) my/likes#liking
自分のというのをmyで表しており、直感的なURL(自分がいいねしているユーザーを表しているページ、ということがわかりやすい)になります。
URLをグループ化できるので、メンテナンスがしやすい
実際にユーザーが利用する画面と、管理者側で画面を分けたい時などにも使えます。
routes.rb
namespace :admin do
resources :users
end
scope module: :public do
resources :users
end
上記のようにすれば、管理者側でコントロールできるユーザー一覧ページと公開されているユーザーページを分けることができます。
namespaceの使い方
では実際の使い方です。
routes.rb内は上にも書いてありますが、もう一度。。。。。
routes.rb
Rails.application.routes.draw do
namespace :my do
get '/liking', :to => "likes#liking"
end
end
namespace グループ化したいディレクトリ名 do
httpメソッド 実際の表記されるURL, :to => "コントローラー名#アクション名"
end
注意点としては、フォルダの構成もURLに合わせて変えていかないとダメです。
上に書いてあるURLですが、
my_liking GET /my/liking(.:format) my/likes#liking
右のController#Actionにmy/というものがついています。
これはmyディレクトリ以下にある、likesコントローラーを実行するということになります。
なので、likesコントローラーを作成するタイミングで、myファイルの下を指定する必要があります。
ちなみにそのやり方は。。。。。
rails g controller my::likes
#=> create app/controllers/my/likes_controller.rb
となります。