it-swarm-pt.tech

Concepção: desativar a confirmação de senha durante a inscrição

Estou usando o Devise for Rails. No processo de registro padrão, o Devise exige que os usuários digitem a senha duas vezes para validação e autenticação. Como posso desabilitá-lo?

41
Victor Lam

Para desativar a confirmação de senha você pode simplesmente remover o password_confirmation campo do formulário de inscrição. Isso desativa a necessidade de confirmar a senha completamente!

  1. Gere visualizações conceituais se você não tiver: Rails g devise:views
  2. Remova o password_confirmation seção em app\views\devise\registrations\new.html.erb

Uma maneira de fazer isso:

<%# Disable password confirmation so that the user doesn't have to enter a password twice %>
<% if false %>
  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
  </div>
<% end %>

A razão pela qual isso funciona está em lib/devise/models/validatable.rb na fonte do Devise:

module Devise
  module Models
    module Validatable


      def self.included(base)

        base.class_eval do
          #....SNIP...
          validates_confirmation_of :password, :if => :password_required?
        end
      end

      #...SNIP...

      def password_required?
        !persisted? || !password.nil? || !password_confirmation.nil?
      end
    end
  end
end

Observe que a validação é acionada apenas se password_required? retorna true e password_required? retornará false se o password_confirmation campo é nil.

Porque onde o password_confirmation o campo está presente no formulário, ele sempre será incluído no hash dos parâmetros; como uma string vazia, se for deixada em branco, a validação será acionada. No entanto, se você remover a entrada do formulário, o password_confirmation nos parâmetros é nil e, portanto, a validação não será acionada.

84
mistertim

Parece que se você apenas remover o requisito attr_accessible do modelo, ele funcionará perfeitamente sem ele.

Em uma nota lateral, concordo com esta prática, no caso raro de erro de digitação, o usuário pode simplesmente usar a recuperação de senha para recuperar sua senha.

36
Jeff Dickey

Não estou familiarizado com o Devise, mas se você tiver acesso ao modelo no controlador antes de salvar/validar, poderá fazer algo como o seguinte

model.password_confirmation = model.password
model.save
11
Will

Por uma questão de Rails 4 usuários que encontram essa pergunta, basta excluir :password_confirmation dos parâmetros permitidos, que você declara em ApplicationController.rb.

before_filter :configure_permitted_parameters, if: :devise_controller?

protected

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) do |u|
    u.permit(:username, :email, :password)
  end
  devise_parameter_sanitizer.for(:account_update) do |u|
    u.permit(:username, :email, :password)
  end
end
3
Jimeux

Solução mais simples:

Remover : validatable de

devise :database_authenticatable, :registerable,
 :recoverable, :rememberable, :trackable,
 :confirmable, :timeoutable, :validatable

;)

2
Nesha Zoric

Você só precisa remover o campo password_confirmation do seu formulário.

2
Robin Garg

Veja wiki

def update_with_password(params={})
  params.delete(:current_password)
  self.update_without_password(params)
end

https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password

1
Peter Ehrlich

Eu acho que esta é a maneira simples de desativar a confirmação de senha: https://github.com/plataformatec/devise/wiki/Disable-password-confirmation-during-registration

Alguns usuários desejam tornar o processo de registro mais curto e fácil. Um dos campos que podem ser removidos é a confirmação da senha.

A solução mais fácil é: você pode simplesmente remover o campo password_confirmation do formulário de registro localizado em devise/registrations/new.html.erb (new.html.haml se você estiver usando HAML), o que desativa a necessidade de confirmar a senha por completo!

A razão disso está em lib/devise/models/validatable.rb na fonte Devise:

Observe que a validação é acionada apenas se password_required? retorna true e password_required? retornará false se o campo password_confirmation for nulo.

Como onde o campo password_confirmation está presente no formulário, ele sempre será incluído no hash dos parâmetros, como uma sequência vazia se for deixada em branco, a validação é acionada. No entanto, se você remover a entrada do formulário, a senha_confirmação nos parâmetros será nula e, portanto, a validação não será acionada.

0
Tomoka Miyazawa

Validações padrão do Devise (lib/devise/models/validatable.rb):

validates_confirmation_of :password, :if => :password_required?

e método:

def password_required?
  !persisted? || !password.nil? || !password_confirmation.nil?
end

Precisamos substituir a validação de senha padrão do Devise. Coloque o seguinte código no final para que não seja substituído por nenhuma das configurações do Devise.

validates_confirmation_of :password, if: :revalid
def revalid
  false
end

E seu modelo ficaria assim:

class User < ActiveRecord::Base      
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable,
     :confirmable, :timeoutable, :validatable

  validates_confirmation_of :password, if: :revalid

  def revalid
    false
  end
end

Em seguida, remova o campo password_confirmation do formulário de registro.