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