はじめに
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