Railsアプリにdeviseを導入すると、routes.rbにこのように書いたりする。
devise_for :users, controllers: {
sessions: 'users/sessions',
registrations: 'users/registrations',
}
devise_scope :user do
get 'signup', to: 'users/registrations#new', as: :signup
get 'login', to: 'users/sessions#new', as: :login
delete 'logout', to: 'users/sessions#destroy', as: :logout
end
devise_forとdevise_scopeとは?その使い分けは? を整理した。
devise_for, devise_scope = devise独自のルート定義メソッド
devise_for, devise_scope = ActionDispatch::Routing::Mapperクラスのメソッド。
Routing::Mapperクラスには、Rails.application.routes.draw do ... endブロック内で使える、ルート定義を行うメソッドたちが含まれる。
get, delete, resourcesなどのRails標準搭載のRouting::Mapperクラスのメソッドに追加して、devise独自のメソッドとしてdevise_for, devise_scope などが定義されている。
devise_for と devise_scopeの使い分け
結論
devise_forで標準ルーティングを一括生成して、さらに必要なカスタムルーティングをdevise_scopeで生成する。
devise_for 詳細
devise_for: deviseを使うモデル (Userなど) で定義したmodule (e.g. registerable, validatable) をもとに、deviseの標準的なルーティングを一括生成。モデル, パス, コントロール etc.の指定ができる。
(devise_forの内部ではdevise_scopeを呼んでいる)
devise_for :resources
# example
devise_for :users do
class_name: 'Account', # モデルの指定 User -> Account
# --- or ---
path: 'accounts', # パスの指定 /users -> /accounts
# --- or ---
controllers: { sessions: 'users/sessions' } # コントローラの指定 devise/sessions -> users/sessions
end
参考:devise rubydoc > devise_for
devise_scope 詳細
devise_scope: 新たにdevise関連のルーティングを追加する時に使う。パスとcontroller#actionを対応付ける。
(scope = deviseを使っているモデルに対応した識別子)
devise_scope :scope do
get '/some/route', to: 'some_devise_controller#action', as: :some_path_name
end
# `as`がエイリアスメソッドなので下記のようにも書ける
as :user do
get 'login', to: 'devise/sessions#new', as: :login
end