2012-03-18 17 views
16

que tienen un modelo de usuario establecido como tal:¿Cómo deshabilitar las validaciones de contraseña/confirmación cuando se usa has_secure_password en Rails 3.2?

class User < ActiveRecord::Base 
    has_secure_password 

    # callbacks ------------------------------------------------------------------------- 
    before_create { generate_token(:auth_token) } 

    # setup accessible (or protected) attributes for your model and validation ---------- 
    attr_accessible :email, :password, :password_confirmation 

    # validations 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email , presence: true, 
         uniqueness: { case_sensitive: false }, 
         format: { with: VALID_EMAIL_REGEX } 

    validates :password    , length: { minimum: 6 } 

    validates :password_confirmation, presence: true 

Pero no quiero la contraseña y/o validaciones password_confirmation se ejecuten cuando se actualiza el usuario menos que el usuario está intentando cambiar su contraseña.

Por lo tanto, si el usuario actualiza su información en un formulario sin especificar una contraseña y/o confirmación, debería tener éxito. Si el usuario actualiza su información e incluye una contraseña y/o confirmación, se ejecutarán las validaciones .

¿Cuál es la mejor manera de lograr esto?

+1

Puede también actualiza los atributos usando @ user.update_attributes ({}) o @ user.update_attribute: attr_name, value. – nverinaud

Respuesta

21

Se podría añadir un condicional :if a ambos validadores:

Opción 1:

validates :password    , length: { minimum: 6 }, :if => :validate_password? 
validates :password_confirmation, presence: true  , :if => :validate_password? 

def validate_password? 
    password.present? || password_confirmation.present? 
end 

Opción 2:

o usar un método para la validación, moviendo las comprobaciones de validación en el método en su lugar de validates llamadas por separado:

validate :check_password, :on => :update 

def check_password 
    return unless password.present? || password_confirmation.present? 
    ..validations for both attributes here.. 
    ..check presence, length etc. as required and add to the errors variable as necessary.. 
end 
+1

opción 1 bien, justo lo que necesitaba. Pero "password_validation" debería ser "password_confirmation". – dougnorton

+0

! Password.nil? es mejor que .present ?, de lo contrario es posible registrarse sin contraseña – Hoetmaaiers

+0

'.present?' devuelve 'true' si la cadena es' nil? 'o' blank? ', por lo que garantiza que la cadena contenga uno o más caracteres aparte desde espacios. – Zabba

Cuestiones relacionadas