remover dinamicamente default_scope de modelos ActiveRecord ao usar o Devise

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