17
18

More than 3 years have passed since last update.

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

Posted at

はじめに

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と指定します。
こうすると、パスのリソースに相当するcurstomersauthへとが変わります。

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オプションを追加してregistrationregisterを指定ます。
こうすると、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

参考

17
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
18