2012-03-18 35 views
16

Tôi có một mô hình người dùng thiết lập như vậy:Làm thế nào để vô hiệu hoá xác nhận mật khẩu/xác nhận khi sử dụng has_secure_password trong 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 

Nhưng tôi không muốn các mật khẩu và/hoặc kiểm chứng thực password_confirmation để chạy khi cập nhật người dùng trừ người dùng đang cố gắng để thay đổi mật khẩu của họ.

Vì vậy, nếu người dùng cập nhật thông tin của họ trong biểu mẫu mà không chỉ định mật khẩu và/hoặc xác nhận, nó sẽ thành công. Nếu người dùng cập nhật thông tin của họ và bao gồm mật khẩu và/hoặc xác nhận, các xác thực sẽ hoạt động.

Cách tốt nhất để thực hiện việc này là gì?

+1

Bạn có thể cũng cập nhật các thuộc tính bằng cách sử dụng @ user.update_attributes ({}) hoặc @ user.update_attribute: attr_name, value. – nverinaud

Trả lời

21

Bạn có thể thêm một điều kiện :if để cả hai xác nhận:

Lựa chọ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 

Phương án 2:

Hoặc sử dụng một phương pháp để xác nhận, di chuyển kiểm tra xác nhận vào phương pháp thay của riêng biệt validates cuộc gọi:

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

tùy chọn 1 tốt đẹp, chỉ là những gì tôi cần. Nhưng "password_validation" nên là "password_confirmation". – dougnorton

+0

! Password.nil? là tốt hơn sau đó .present ?, khác đăng ký không có mật khẩu là có thể – Hoetmaaiers

+0

'.present?' trả về 'true' nếu chuỗi là' nil? 'hoặc' blank? ', do đó, nó đảm bảo rằng chuỗi chứa một hoặc nhiều ký tự cách nhau từ không gian. – Zabba

Các vấn đề liên quan