Come convalidare la presenza di un campo o di un altro ma non di entrambi e almeno uno?Convalida presenza di un campo o di un altro (XOR)
64
A
risposta
111
Il codice funzionerà se si aggiungono i condizionali per le convalide numericality in questo modo:
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
Esempio per rotaie 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 cognome o Madre cognome è obbligatorio
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
Prova sopra un semplice esempio.
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
Si può anche fare questo con 3 o più valori:
if [month_day, week_day, hour].compact.count != 1
31
Penso che questo sia più idiomatica in Rails 3+:
ad esempio: per la convalida che uno dei user_name
o email
è presente:
validates :user_name, presence: true, unless: ->(user){user.email.present?}
validates :email, presence: true, unless: ->(user){user.user_name.present?}
+18
Questo non gestisce i criteri "non entrambi" –
0
ho messo la mia risposta a questa domanda qui sotto. In questo esempio :description
e :keywords
sono campi che uno di questo non può essere vuoto:
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
Problemi correlati
- 1. Convalida presenza di un campo o di un altro o entrambi (OR)
- 2. come convalidare la presenza di un campo solo se un altro campo è stato modificato nelle guide?
- 3. Creazione di un campo "altro"
- 4. come rendere un campo data di input maggiore o uguale a un altro campo data utilizzando la convalida in laravel
- 5. Passaggio di un campo a un altro
- 6. Convalida un campo di scelta popolato dinamicamente
- 7. convalida di un immobile modello è maggiore di un altro
- 8. Avviso di eclissi "la dichiarazione di campo nasconde un altro campo o variabile"?
- 9. Convalida campo non-modello
- 10. MySQL come un altro campo
- 11. Rails 4: Differenza tra convalida presenza sul id o associazione
- 12. Fai un campo unico a seconda un altro campo
- 13. CKEditor plugin - la convalida di un campo di testo
- 14. Rails - Come convalidare un campo solo se un altro campo ha un determinato valore?
- 15. convalida campo di posta elettronica
- 16. Rails convalida presenza non sul valore 0
- 17. Graffetta - Convalida tipo di file ma non Presenza
- 18. CakePHP 3.x ordinamento di un altro modello non funziona
- 19. laravel "almeno un" Campo Obbligatorio convalida
- 20. Convalida numerico campo di testo in jQuery
- 21. AWK/BASH: come abbinare un campo in un file da un campo in un altro?
- 22. symfony2 convalida un valore di un modulo utilizzando un altro valore di forma
- 23. Il campo di amministrazione di Magento dipende da più di un valore o campo?
- 24. MongoDB selezionare tutti i gruppi di campi da un campo e ordinare da un altro campo
- 25. Rails: come utilizzare before_save per modificare un valore di campo basato su un altro campo?
- 26. Come riassumere un campo in base a un altro valore di campo?
- 27. copiare un campo di tavolo in un altro campo nella stessa tabella
- 28. Rails 3 convalida presenza di molte colonne con messaggi personalizzati
- 29. Convalida MVC inferiore/superiore a un altro valore
- 30. jquery validate plugin richiede un campo se un altro campo ha un valore e viceversa
Questo si chiama risposta perfetta. Grazie a @Semanticart –
Le funzionalità funzionano alla grande. Ma, non ho potuto ottenere gli errori mostrati nella pagina del modulo. A meno che non faccia qualcosa come "= @ invoice.errors [: base] [0]" sul mio _form.slim. Eventuali suggerimenti? –