2011-05-05 29 views
6

Điều này có vẻ giống như một câu hỏi đơn giản nhưng tôi dường như không thể tìm thấy câu trả lời ngắn bằng cách viết trình xác thực tùy chỉnh. Tôi có trình xác thực nàyRails 3 xác nhận quy tắc dựa trên hành động

validates :password, :presence => true, :confirmation => true, :length => { :minimum => 5} 

có nhiều quy tắc được áp dụng như một số quy tắc phức tạp hơn, nhưng điều này cho phép nắm bắt.

Vấn đề là tôi chỉ muốn hiện diện được áp dụng khi tạo, mọi thứ khác cần phải được tạo và cập nhật. Bởi vì người dùng có thể không thay đổi mật khẩu khi cập nhật thông tin của họ.

tôi đã cố gắng tách các quy tắc

validates :password, :presence => true, :on => :create 
validates :password, # The rest of the rules 

Điều này dẫn đến tất cả các quy tắc được bỏ qua để cập nhật. Có cách nào đơn giản để áp dụng chỉ một quy tắc để tạo và phần còn lại cho mọi thứ?

Trả lời

6

Bạn có thể cố gắng giữ nó trong một dòng, nhưng áp dụng :on => :create để chỉ :presence kiểm tra:

validates :password, :presence => {:on => :create}, :confirmation => true, :length => { :minimum => 5} 

Tuy nhiên, tôi không chắc chắn nó làm cho tinh thần để luôn luôn đòi hỏi phải có độ dài tối thiểu, nhưng không phải lúc nào cũng đòi hỏi hiện diện - nếu bạn cập nhật bản ghi hiện có bằng mật khẩu trống, nó sẽ không xác thực vì độ dài là 0.

+0

Điểm tốt. Tôi có thể phải nhìn sâu hơn một chút. Một số yêu cầu của mật khẩu đã nhập có thể thất bại nếu nó trống. –

0

Linh cảm của tôi là vấn đề là xác thực: cuộc gọi mật khẩu không phải là phụ gia. Bạn có thể chuyển đổi séc hiện diện thành:

validates_presence_of :password, :on=>:create 

Và sau đó giữ các xác thực khác của bạn bằng cách xác thực. Điều đó có hiệu quả không?

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