deviseのルーティングをカスタマイズする

## はじめに
deviseは自動的にもろもろの設定を追加してくれる便利なGemですが、ルーティングをスタマイズすることになって苦戦したので、調べたことをまとめます。

deviseはさまざまなコントローラがありますが、基本的なDevise::RegistrationsControlleコントローラーとそのルーティングに絞ってをみていきます。

## カスタマイズしない場合
デフォルトのルーティングはこの様になっています。

```config/routes.rb
Rails.application.routes.draw do
  devise_for :customers, path: 'auth'
end
```

```
$ rails routes | grep registrations
cancel_customer_registration GET    /customers/cancel(.:format)   devise/registrations#cancel
  new_customer_registration GET    /customers/sign_up(.:format)   devise/registrations#new
  edit_customer_registration GET    /customers/edit(.:format)      devise/registrations#edit
      customer_registration PATCH  /customers(.:format)           devise/registrations#update
                            PUT    /customers(.:format)           devise/registrations#update
                            DELETE /customers(.:format)           devise/registrations#destroy
                            POST   /customers(.:format)           devise/registrations#create
```

## pathオプションでリソースのパスを変更する
pathオプションを追加して`auth`と指定します。
こうすると、パスのリソースに相当する`curstomers`が`auth`へとが変わります。

```config/routes.rb
Rails.application.routes.draw do
  devise_for :customers, path: 'auth'
end
```
```
$ rails routes | grep registrations
cancel_customer_registration GET    /auth/cancel(.:format)    devise/registrations#cancel
  new_customer_registration GET    /auth/sign_up(.:format)   devise/registrations#new
  edit_customer_registration GET    /auth/edit(.:format)      devise/registrations#edit
      customer_registration PATCH  /auth(.:format)           devise/registrations#update
                            PUT    /auth(.:format)           devise/registrations#update
                            DELETE /auth(.:format)           devise/registrations#destroy
                            POST   /auth(.:format)           devise/registrations#create
```

## path_namesオプションでパスを追加する
path_namesオプションを追加して`registration`に`register`を指定ます。
こうすると、`register`のパスの階層が追加されます。

```
Rails.application.routes.draw do
  devise_for :customers, path_names: { registration: 'register' }
end
```
```
$ rails routes | grep registrations
cancel_customer_registration GET    /customers/register/cancel(.:format)   devise/registrations#cancel
  new_customer_registration GET    /customers/register/sign_up(.:format)  devise/registrations#new
  edit_customer_registration GET    /customers/register/edit(.:format)     devise/registrations#edit
      customer_registration PATCH  /customers/register(.:format)          devise/registrations#update
                            PUT    /customers/register(.:format)          devise/registrations#update
                            DELETE /customers/register(.:format)          devise/registrations#destroy
                            POST   /customers/register(.:format)          devise/registrations#create
```

## skipオプションで対応付けをスキップする
skipオプションを追加して`registrations`を指定します。
こうすると、`registratiosns`マッピングがスキップされます。
スキップされたままだと利用できないので、次の項で任意にカスタマイズする方法を説明します。

```
Rails.application.routes.draw do
  devise_for :customers, skip: 'registrations'
end
```

```
$ rails routes | grep registrations
## 何も出力されない
```

## devise_scopeメソッドでパスを任意に指定する
devise_scopeメソッドを使うことでより柔軟にルーティングをカスタマイズできます。
ここでは、パスに`signup`を指定しdeviseのコントローラーを追加します。

```
Rails.application.routes.draw do
  devise_for :customers, skip: 'registrations'
  devise_scope :customer do
    get 'signup', to: 'devise/registrations#new', as: :new_customer_registration
    post 'signup', to: 'devise/registrations#create', as: :customer_registration
  end
end
```

```
$ rails routes | grep registrations
new_customer_registration GET    /signup(.:format)   devise/registrations#new
    customer_registration POST   /signup(.:format)   devise/registrations#create
```

## 参考
- [heartcombo/devise](https://github.com/heartcombo/devise#configuring-routes)
- [devise デフォルトルーティングのカスタマイズ](https://qiita.com/kumasuke/items/240c1cc14543d1e1c33e)