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と関係がある場合だかなんだかあるらしいがよくわからなかったので勉強しなおしてまた編集したいと思う。

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