8

Tôi đang cố gắng tạo điều kiện trong đó thuộc tính 'một' bằng 0 và thuộc tính 'hai' là một, thì mô hình không hợp lệ. Nhưng khi tôi thực hiện:Xác thực với: nếu

Model.create(:one => 1, :two => 0).valid? 

Đơn vị kiểm tra trả về true! Tại sao?

validates :one, :two, :presence => true, :if => :if condition_testing? 

def condition_testing? 
    !(one == 0 && two == 1) 
end 

Trả lời

12

Tôi nghĩ rằng bạn có một lỗi trong cú pháp của bạn:

validates :one, :two, :presence => true, :if => :condition_testing? 

def condition_testing? 
    !(one == 0 && two == 1) 
end 

Có một: nếu quá nhiều trong đó ... Và nếu tôi hiểu đúng bạn muốn có nó chỉ xác nhận trong trường hợp one == 0 && two == 1? Sau đó, bạn condition_testing? được đảo ngược (bỏ qua!())

Nếu không chắc chắn bạn có thể thử sử dụng pry và chèn điểm ngắt vào phương pháp condition_testing? để xem điều gì đang xảy ra.

(Xin lưu ý thêm ":" trước khi kiểm tra điều kiện)

+0

Không, đó là chính xác. Điều xảy ra là bất cứ giá trị nào của thuộc tính luôn luôn nói rằng mô hình là hợp lệ và tôi muốn rằng khi 'một' và 'hai' là 0 và 1 cho biết mô hình không hợp lệ. – James

3

Vấn đề là bạn đang sử dụng một validator hiện diện với một điều kiện để kiểm tra các giá trị của các thuộc tính. Điều này là không chính xác. Trình kiểm tra sự hiện diện kiểm tra để đảm bảo các thuộc tính đó được đặt. Điều tệ hơn là bạn đang chuyển tùy chọn if (@Tigraine đã đúng về cú pháp của bạn sai), có nghĩa là bất cứ khi nào phương thức đó trả về true, sự hiện diện sẽ không được kiểm tra. Cách bạn đã thiết lập này, trình xác thực sẽ chỉ chạy khi one bằng 1 và two bằng 0. Nếu không, không có xác thực nào được chạy! Tôi nghĩ tùy chọn tốt nhất ở đây là viết xác nhận tùy chỉnh:

validates :one_and_two 

def one_and_two 
    errors.add(:base, "one must be 1 and two must be 0") if !(one == 0 && two == 1) 
end 

Điều này sẽ thêm lỗi vào mẫu với thông báo được chỉ định nếu điều kiện trả về đúng. (Lưu ý: Tôi vẫn chưa rõ ràng về điều kiện nào hợp lệ và không hợp lệ, vì vậy vui lòng thay đổi phần cuối cùng cho phù hợp với nhu cầu của bạn.)

+0

"có nghĩa là bất cứ khi nào phương thức đó trả về true, sự hiện diện sẽ không được kiểm tra" - điều này hoàn toàn sai. http://guides.rubyonrails.org/active_record_validations.html#conditional-validation - xác thực chỉ chạy nếu: nếu phương thức trả về true. – Aldekein

8

Bạn có thể xác nhận nó trong một dòng:

validates :one, :two, :presence => true, :if => Proc.new { |a| !(a.one == 0 && a.two == 1) } 
Các vấn đề liên quan