Quando você tem um modelo de usuário que tem um escopo padrão como:
default_scope ->{
where(invitation_token: nil)
.where.not(first_name: nil)
}
isso pode causar muitos problemas com o Devise porque todos os métodos de pesquisa no recurso não removem o default_scope.
Portanto, se você tivesse alguém que foi convidado e desejasse que ele fizesse o login para preencher o primeiro nome, ele não seria capaz de fazer o login para fazer isso porque seu registro seria filtrado pelo escopo padrão ao definir o usuário atual .
Incluindo isso abaixo, você pode substituir dinamicamente todos os métodos de classe nas estratégias do Devise que são responsáveis por consultar o registro e autenticá-lo por meio do Warden.
require 'active_support/concern'
module DeviseOverrides
extend ActiveSupport::Concern
included do
class << self
# If you have other strategies, you could add/remove them from the array below
[:authenticatable, :invitable, :database_authenticatable, :registerable, :confirmable,
:recoverable, :rememberable, :validatable].each do |strategy|
klass = "Devise::Models::#{strategy.to_s.camelize}::ClassMethods".constantize
klass.instance_methods(false).each do |func|
define_method(func) do |*args|
unscoped { super(*args) }
end
end
end
end
end
end
* Isso também torna a atualização segura porque se qualquer método de classe nos modelos do Devise for alterado ou adicionado, ele os incluirá automaticamente 🙂 *
Você pode então incluir isso em sua classe de usuário, ou qualquer outra classe que você tenha um default_scope definido.
class User < ActiveRecord::Base
include DeviseOverrides
end