Làm cách nào để xác thực sự hiện diện của một trường hoặc trường khác nhưng không phải cả hai trường và ít nhất một trường?Xác nhận sự hiện diện của một trường này hoặc trường khác (XOR)
64
A
Trả lời
111
Mã của bạn sẽ làm việc nếu bạn thêm điều kiện để kiểm chứng thực numericality như vậy:
class Transaction < ActiveRecord::Base
validates_presence_of :date
validates_presence_of :name
validates_numericality_of :charge, allow_nil: true
validates_numericality_of :payment, allow_nil: true
validate :charge_xor_payment
private
def charge_xor_payment
unless charge.blank?^payment.blank?
errors.add(:base, "Specify a charge or a payment, not both")
end
end
end
9
Ví dụ cho đường ray 3.
class Transaction < ActiveRecord::Base
validates_presence_of :date
validates_presence_of :name
validates_numericality_of :charge, :unless => proc{|obj| obj.charge.blank?}
validates_numericality_of :payment, :unless => proc{|obj| obj.payment.blank?}
validate :charge_xor_payment
private
def charge_xor_payment
if !(charge.blank?^payment.blank?)
errors[:base] << "Specify a charge or a payment, not both"
end
end
end
2
validate :father_or_mother
#Father tên cuối cùng hoặc mẹ tên cuối cùng là bắt buộc
def father_or_mother
if father_last_name == "Last Name" or father_last_name.blank?
errors.add(:father_last_name, "cant blank")
errors.add(:mother_last_name, "cant blank")
end
end
Thử ví dụ đơn giản ở trên.
7
class Transaction < ActiveRecord::Base
validates_presence_of :date
validates_presence_of :name
validates_numericality_of :charge, allow_nil: true
validates_numericality_of :payment, allow_nil: true
validate :charge_xor_payment
private
def charge_xor_payment
if [charge, payment].compact.count != 1
errors.add(:base, "Specify a charge or a payment, not both")
end
end
end
Bạn thậm chí có thể làm điều này với 3 hoặc nhiều giá trị:
if [month_day, week_day, hour].compact.count != 1
31
Tôi nghĩ rằng đây là thành ngữ hơn trong Rails 3+:
ví dụ: Đối với việc chứng thực rằng một trong những user_name
hoặc email
có mặt:
validates :user_name, presence: true, unless: ->(user){user.email.present?}
validates :email, presence: true, unless: ->(user){user.user_name.present?}
+18
Điều này không xử lý tiêu chí "không phải cả hai" –
0
Tôi đặt câu trả lời cho câu hỏi này bên dưới. Trong ví dụ này, :description
và :keywords
là các trường không được để trống:
validate :some_was_present
belongs_to :seo_customable, polymorphic: true
def some_was_present
desc = description.blank?
errors.add(desc ? :description : :keywords, t('errors.messages.blank')) if desc && keywords.blank?
end
Các vấn đề liên quan
- 1. Làm cách nào để bạn xác thực sự hiện diện của một trường từ nhiều số
- 2. làm cách nào để xác thực sự hiện diện của một trường chỉ khi một trường khác được chỉnh sửa trong đường ray?
- 3. Xác thực kích hoạt của một trường khi một trường khác được thay đổi
- 4. xác thực sự hiện diện của has_and_belongs_to_many
- 5. Thực hiện xác nhận vào các trường ẩn
- 6. Giá trị TFS "Sao chép" từ một trường này sang một trường khác
- 7. jQuery X-Editable: Cập nhật trường chọn dựa trên giá trị của trường chọn khác
- 8. Xác thực một Trường Ẩn
- 9. Đường ray - Cách xác thực trường chỉ khi một trường khác có giá trị nhất định?
- 10. Chú thích xác nhận Hibernate - xác nhận rằng ít nhất một trường không phải là rỗng
- 11. Xác thực giữa nhiều trường ở các cấp khác nhau
- 12. Django: Trường Lỗi Trường không xác định
- 13. AWK/BASH: cách khớp một trường trong một tệp từ một trường trong một trường khác?
- 14. Sự cố khi tạo môi trường lstnewen môi trường bắt đầu/kết thúc một môi trường khác
- 15. Sự khác biệt giữa hai trường hợp cùng một lớp
- 16. Sự khác biệt của trường Nhập CMS CMS so với trường Văn bản là gì?
- 17. ckeditor Plugin - xác nhận một trường văn bản
- 18. Cập nhật MongoDB. Cố gắng đặt một trường từ thuộc tính của một trường khác
- 19. Tạo một trường chỉ đọc trong Django Admin, dựa trên giá trị của trường khác
- 20. Giao diện thực hiện ra mắt trường hợp ngoại lệ khác nhau
- 21. Rails 3 xác nhận sự hiện diện của nhiều cột với thông điệp tùy chỉnh
- 22. tràn số trường - trường nào chính xác?
- 23. Trường hợp biểu hiện khác nhau trong Ruby 1.9?
- 24. Xác nhận Asp.Net MVC - các trường phụ thuộc
- 25. Xác nhận trường biểu mẫu duy nhất chỉ trong Symfony2
- 26. xác thực jquery chỉ xác nhận trường đầu tiên - những người khác bị bỏ qua
- 27. jquery: xác nhận rằng trường văn bản là số
- 28. Throwing nhiều trường hợp ngoại lệ trong một method của một giao diện trong java
- 29. Xác nhận các trường bằng nhau trong Symfony 2
- 30. Xác thực trường chọn
Đây được gọi là câu trả lời hoàn hảo. Cảm ơn @Semanticart –
Chức năng hoạt động tuyệt vời. Nhưng, tôi không thể nhận được các lỗi được hiển thị trên trang biểu mẫu. Trừ khi tôi làm điều gì đó như ´ = @ invoice.errors [: base] [0] 'trên _form.slim của tôi. Bất kỳ đề xuất? –