コントローラの名前空間とルーティングの件

こんにちは、たにーです。

今回は、ルーティングを書く方法でどんななのがあるのか記述していきます。
チーム開発でURLに特定の文字を含めない、グルーピングしないといけないなど
新しいルーティングの書き方を学びました。

知らない書き方もあったことから、記憶に残っている内に
復習すべきと思い、今回記述していくことにしました。

#① 〇〇　=> 〇〇#〇〇
urlごとに設定していく記述
おそらくこれは基本かと思います。

```rb:routes.rb
    get 'homes/top'   => "homes#top"
    get 'homes/about' => "homes#about"
```

rails routesで確認。

```title:terminal
       Prefix Verb       URI Pattern        Controller#Action
    homes_top GET    /homes/top(.:format)     homes#top
  homes_about GET    /homes/about(.:format)   homes#about
```

#② resources :〇〇

resourcesで簡単に設定できる方法です。

```rb:routes.rb
    resources :books
```

rails routesで確認。

```title:terminal
       Prefix Verb       URI Pattern        Controller#Action
       books GET    /books(.:format)          books#index
             POST   /books(.:format)          books#create
    new_book GET    /books/new(.:format)      books#new
   edit_book GET    /books/:id/edit(.:format) books#edit
        book GET    /books/:id(.:format)      books#show
             PATCH  /books/:id(.:format)      books#update
             PUT    /books/:id(.:format)      books#update
             DELETE /books/:id(.:format)      books#destroy
```

ちなみに、いらないページ、アクションなどある場合は、指定することも出来ます。

##指定する場合

```rb:routes.rb
    resources :books, only:[:index, :show]
```

```title:terminal
       Prefix Verb       URI Pattern        Controller#Action
       books GET    /books(.:format)          books#index
        book GET    /books/:id(.:format)      books#show
```

後ろに、onlyをつけるだけでresourcesに制限をかけれます。
不必要なルーティンがある場合は、これで削除したほうが余計な情報がなくなって見やすくもなります。

# ③ namespace

コントローラを名前空間によってグループ化することもできます。
先日書いたQiita記事のuserとadminがある場合に、使うと思います。

```rb:routes.rb
  namespace :admins do
    resources :items, only:[:index, :show, :edit, :new]
  end
```

これにより、itemspath名、URL、コントローラアクションに**admin**が加わります。

```title:terminal
           Prefix Verb       URI Pattern                   Controller#Action
     admins_items GET    /admins/items(.:format)           admins/items#index
  new_admins_item GET    /admins/items/new(.:format)       admins/items#new
 edit_admins_item GET    /admins/items/:id/edit(.:format)  admins/items#edit
      admins_item GET    /admins/items/:id(.:format)       admins/items#show
```

# ④ scope module

URLからadminsを消したURLにしたい場合は、scope moduleを使います。

```rb:routes.rb(ブロック有)
  scope module: :admins do
    resources :items, only:[:index, :show, :edit, :new]
  end
```
もしくは、ブロックを使わない書き方も可能。

```rb:routes.rb(ブロック無)
    resources :items, only:[:index, :show, :edit, :new], module: "admin"
```


これにより、URLにadminsの文字が含まれない様になります。

```title:terminal
           Prefix Verb       URI Pattern            Controller#Action
     admins_items GET    /items(.:format)           admins/items#index
  new_admins_item GET    /items/new(.:format)       admins/items#new
 edit_admins_item GET    /items/:id/edit(.:format)  admins/items#edit
      admins_item GET    /items/:id(.:format)       admins/items#show
```

# ⑤ scope

④の逆バージョンになります。
adminsなしのコントローラーにしたい場合は、scopeを使います。

```rb:routes.rb
  scope 'admins' do
    resources :items, only:[:index, :show, :edit, :new]
  end
```
これにより、コントローラーからadminsが消えました。

```title:terminal
           Prefix Verb       URI Pattern                   Controller#Action
     admins_items GET    /admins/items(.:format)           items#index
  new_admins_item GET    /admins/items/new(.:format)       items#new
 edit_admins_item GET    /admins/items/:id/edit(.:format)  items#edit
      admins_item GET    /admins/items/:id(.:format)       items#show
```

#まとめ

以上がルーティング設定の方法です。

まとめると、

- 〇〇=>〇〇#〇〇
- resoureces
- namespace
- scope module
- scope

これらの5つの書き方で大抵のことは対応できるかと思います。

もし、間違っていたらご指摘いただけますと幸いです。

以上、たにーでした。

# 参考文献

https://railsguides.jp/routing.html

https://teratail.com/questions/173477