Rails 6.1 + Devise 4.8.0 で、ルーティングから一部のdeviseモジュールの URI Pattern を削除する

Rails + Deviseでは、ModelにDeviseのモジュールを組み込むと、自動的に routes へ URI Pattern が追加されます。

例えば、

Rails.application.routes.draw do
  root to: 'home#index'

  devise_for :users
end

な routes.rb の時、DeviseのModelが

class User < ApplicationRecord
  devise :database_authenticatable,
         :registerable,
         :recoverable,
         # :confirmable,
         :validatable,
         :lockable
end

な場合、

% bin/rails routes
...
    user_registration PATCH  /users(.:format)
                      PUT    /users(.:format)
                      DELETE /users(.:format)
                      POST   /users(.:format)
      new_user_unlock GET    /users/unlock/new(.:format)
          user_unlock GET    /users/unlock(.:format)

となります。

この状態で、Deviseの Confirmableコメントアウトを外し

class User < ApplicationRecord
  devise :database_authenticatable,
         :registerable,
         :recoverable,
         :confirmable,
         :validatable,
         :lockable
end

とすると

% bin/rails routes
...
    user_registration PATCH  /users(.:format)
                      PUT    /users(.:format)
                      DELETE /users(.:format)
                      POST   /users(.:format)
new_user_confirmation GET    /users/confirmation/new(.:format)  # 追加
    user_confirmation GET    /users/confirmation(.:format)  # 追加
                      POST   /users/confirmation(.:format)  # 追加
      new_user_unlock GET    /users/unlock/new(.:format)
          user_unlock GET    /users/unlock(.:format)

になります。

 
ただ、

  • Confirmable モジュールは使いたい
  • URI Pattern を追加したくない

の場合はどうすればよいか迷ったため、メモを残します。

 

目次

 

環境

  • Rails 6.1.3.2
  • Devise 3.8.0

 

対応

routes.rb の devise_forskip を使います。
ruby on rails 3 - How do I remove the Devise route to sign up? - Stack Overflow

 
例えば、Modelが

class User < ApplicationRecord
  devise :database_authenticatable,
         :registerable,
         :recoverable,
         :confirmable,
         :validatable,
         :lockable
end

の時に、routes.rbを

Rails.application.routes.draw do
  root to: 'home#index'

  devise_for :users, 
             skip: ['confirmations']  # 追加
end

とすると、

% bin/rails routes
...
    user_registration PATCH  /users(.:format)
                      PUT    /users(.:format)
                      DELETE /users(.:format)
                      POST   /users(.:format)
      new_user_unlock GET    /users/unlock/new(.:format)
          user_unlock GET    /users/unlock(.:format)

confirmableURI Patternがなくなりました。