Edited at

Railsのルーティングについて整理


初めに

Railsのルーティングについて曖昧でなんとなくやっていたので知識を整理する


resourceとresources

resourceとresourcesはどちらも自動で基本的に使うルーティングを設定してくれます。

例えば

resources :cats とすれば

                     cats GET    /cats(.:format)                                cats#index

POST /cats(.:format) cats#create
new_cat GET /cats/new(.:format) cats#new
edit_cat GET /cats/:id/edit(.:format) cats#edit
cat GET /cats/:id(.:format) cats#show
PATCH /cats/:id(.:format) cats#update
PUT /cats/:id(.:format) cats#update
DELETE /cats/:id(.:format) cats#destroy

と設定してくれる。

基本的に複数あるものに対してのルーティングに使われる

逆にresourceは

                 new_cats GET    /cats/new(.:format)                          cats#new

edit_cats GET /cats/edit(.:format) cats#edit
cats GET /cats(.:format) cats#show
PATCH /cats(.:format) cats#update
PUT /cats(.:format) cats#update
DELETE /cats(.:format) cats#destroy
POST /cats(.:format) cats#create

という感じで複数無いことが前提になっているのでidを指定することがないルーティングになっている。

ちなみにresourcesは

resources :users, :posts, :groups

みたいに設定できるっぽい


resourcesの制限

resourcesでつかうpathに制限を付けれて

resourcesで使うアクションに制限を付けれる。

同じpathに複数のpathが割り当てられているのでpathに制限をかけているわけではない。

resources :cats, only: [:index]

resources :cats, except: [:index]

こんな感じに設定する

onlyは指定したのだけexceptはそれ以外


ヘルパーメソッドについて

ヘルパーメソッドはcats_path とか new_cat_pathみたいな感じでルーティングを指定できるもののこと

ヘルパーメソッドはcats_pathで/catsやcat_pathで/cats/:idといったパス文字列を生成するもの

link_to や redirect_toなどにurlを直接書かないほうがなんか良いらしいのでこのようにヘルパーメソッドを使ったほうが良い。

ちなみにresourcesに対してのヘルパーメソッドはそれぞれ

index => cats_path

show => cat_path(@cat)
new => new_cat_path
create => cats_path
edit => edit_cat_path
update => cat_path(@cat)
destroy => cat_path

index,create,destoryはヘルパーメソッドが同じだメソッドがgetかpostかdeleteかで何を行うかを識別している。


AS

ルートには名前を付けることができて

get 'cats/index', as: 'hello_world'

こんな感じで設定すると

hello_world_pathでcats/indexにアクセスしてくれる。

hello_world_pathでcats/indexというパス文字列を作成してくれる。


namespace

namespaceを使うとurlの前に任意のpathを入れれる。

説明が下手だけと見れもらえばわかる

namespace :admin do

resources :cats
end

とするとルートは

           new_admin_cats GET    /admin/cats/new(.:format)           admin/cats#new

edit_admin_cats GET /admin/cats/edit(.:format) admin/cats#edit
admin_cats GET /admin/cats(.:format) admin/cats#show
PATCH /admin/cats(.:format) admin/cats#update
PUT /admin/cats(.:format) admin/cats#update
DELETE /admin/cats(.:format) admin/cats#destroy
POST /admin/cats(.:format) admin/cats#create

こんな感じにすべてadmin/が最初につく

ちなみにこれに対応するようなコントローラーを作りたい場合は

rails g controller Admin::cats

みたいにする

またルートの設定をcontrollerごとにまとめれるようで

controller :cats do 

resources :cats
end

controller :dogs do
resources :dogs
end

こんな感じに書くこともできる


終わりに

scopeとnamespaceの違いがnamespaceはcontrollerと関係がある場合だかなんだかあるらしいがよくわからなかったので勉強しなおしてまた編集したいと思う。

また何か間違っているところがあればご指摘いただければと思います。