#初めに
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と関係がある場合だかなんだかあるらしいがよくわからなかったので勉強しなおしてまた編集したいと思う。
また何か間違っているところがあればご指摘いただければと思います。