Как проверить наличие одного или нескольких полей, но не обоих, и не менее одного?Подтвердить наличие одного или нескольких полей (XOR)
64
A
ответ
111
Ваш код будет работать, если вы добавите условными к numericality валидаций так:
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
Пример для рельсов 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 фамилия или мать фамилия обязательные
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
Попробуйте более простой пример.
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
Вы можете даже сделать это с 3-х или более значений:
if [month_day, week_day, hour].compact.count != 1
31
Я думаю, что это более идиоматических в Rails 3 +:
например: Для проверки того, что один из user_name
или email
:
validates :user_name, presence: true, unless: ->(user){user.email.present?}
validates :email, presence: true, unless: ->(user){user.user_name.present?}
+18
Это не относится к критериям «не оба» –
0
Я поставил свой ответ на этот вопрос ниже. В этом примере :description
и :keywords
являются поля, которые один из этого не может быть пустым:
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
Смежные вопросы
- 1. Подтвердить наличие одного поля или другого (ИЛИ)
- 2. XML без пространства имен. Подтвердить наличие одного из нескольких XSD
- 3. Подтвердить ввод нескольких текстовых полей
- 4. Как можно подтвердить наличие только одного?
- 5. Bash Shell Script: подтвердить существование одного или нескольких каталогов
- 6. Validate Наличие хотя бы одного из нескольких
- 7. Проверить наличие нескольких полей в документе MongoDB
- 8. Подтвердить наличие asssociation Rails
- 9. Подтвердить наличие файла
- 10. Подтвердить наличие пустого UITextField?
- 11. Наличие нескольких выходов для одного действия
- 12. Подтвердить наличие взаимно исключающих ассоциаций
- 13. Java: наличие нескольких объектов одного класса
- 14. Игнорирование одного или нескольких полей во время сериализации
- 15. Правильный формат для одного или нескольких полей range_for в form_for
- 16. has-many-through создать! подтвердить наличие
- 17. проверить наличие нескольких экземпляров
- 18. Экспорт одного или нескольких типов
- 19. Проверьте наличие одного из нескольких значений в столбце
- 20. Обновление нескольких полей + строк одного запроса
- 21. Наличие одного потока для получения нескольких объектов из общего списка
- 22. JQuery Подтвердить: как добавить подтверждение, проверяющее сумму нескольких полей?
- 23. Подтвердить уникальность комбинации нескольких полей модели в loopback
- 24. Как проверить наличие нескольких документов
- 25. Проверить наличие нескольких параметров
- 26. Подтвердить наличие подмодели в соотношении 'has_one'
- 27. Подтвердить наличие атрибутов с помощью RSpec
- 28. Javascript - Как подтвердить наличие двух телефонных номеров
- 29. Как подтвердить наличие пошаговой регистрационной формы?
- 30. Проверка XElement на наличие одного из нескольких возможных XElements
Это называется идеальным ответом. Спасибо @Semanticart –
Функциональность отлично работает. Но я не смог получить ошибки, показанные на странице формы. Если я не сделаю что-то вроде '= @ invoice.errors [: base] [0] 'на моем _form.slim. Какие-либо предложения? –