2012-03-18 15 views
16

Ho un modello utente impostato come tale:Come disabilitare le convalide di password/conferma quando si usa has_secure_password in 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 

Ma non voglio che la password e/o convalide password_confirmation per eseguire quando si aggiorna l'utente a meno che l'utente sta tentando di modificare la propria password.

Quindi, se l'utente aggiorna le proprie informazioni in un modulo senza specificare una password e/o conferma, dovrebbe avere successo. Se l'utente aggiorna le proprie informazioni e include una password e/o conferma le convalide dovrebbe eseguire.

Qual è il modo migliore per realizzare questo?

+1

È possibile aggiorna anche gli attributi usando @ user.update_attributes ({}) o @ user.update_attribute: attr_name, valore. – nverinaud

risposta

21

Si potrebbe aggiungere un condizionale :if ad entrambe validatori:

Opzione 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 

Opzione 2:

Oppure utilizzare un metodo per la convalida, spostare i controlli di convalida nel metodo, invece di chiamate separate validates:

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

opzione 1 bello, proprio quello di cui avevo bisogno. Ma "password_validation" dovrebbe essere "password_confirmation". – dougnorton

+0

! Password.nil? è meglio quindi .present ?, altrimenti è possibile registrarsi senza password – Hoetmaaiers

+0

'.present?' restituisce 'true' se la stringa è' nil? 'o' blank? ', quindi assicura che la stringa contenga uno o più caratteri a parte dagli spazi. – Zabba

Problemi correlati