5 votes

Comment ajouter un message d'erreur plus significatif à une association has_many?

Mon modèle utilisateur a de nombreuses adresses comme ceci :

class User < ApplicationRecord
  has_many :addresses, dependent: :destroy
  accepts_nested_attributes_for :addresses, allow_destroy: true
end

class Address < ApplicationRecord
  belongs_to :user

  validates :address_line_1, :city, :state, :zip, presence: true
end

Le modèle Address a également une colonne address_type pour signifier soit une adresse travail ou domestique.

Lorsque j'ai essayé de sauvegarder les deux adresses avec des erreurs, je reçois quelque chose qui me semble étrange :

a = User.last
a.addresses # Cet utilisateur a à la fois une adresse à domicile et une adresse de travail
=>  #, #

Comme vous pouvez le voir ci-dessus, Rails n'a fourni qu'une seule erreur lorsque les deux adresses sont invalides ont cette même erreur. Je ne peux pas dire en regardant cela si les deux sont invalides ou juste une seule, et je ne peux pas dire laquelle a l'erreur. Y a-t-il un moyen de fournir un message d'erreur plus détaillé, peut-être quelque chose comme ceci :

{:"work_address.address_line_1"=>[{:error=>:blank}], :"home_address.address_line_1"=>[{:error=>:blank}]}

Ou au moins inclure l'identifiant de l'objet :

{:"addresses.address_line_1"=>[{:error=>:blank, :ids=>[1,2]}]}

2voto

fuentesjr Points 10360

Vous pouvez accéder aux erreurs de validation imbriquées en spécifiant que l'indexation de l'association erreurs via :

has_many :addresses, dependent: :destroy, index_errors: true

En fonction de l'index, vous pouvez ensuite déterminer le addres_type.

Un exemple complet de index_errors: true peut être vu dans cet article ici : https://blog.bigbinary.com/2016/07/07/errors-can-be-indexed-with-nested-attrbutes-in-rails-5.html

0voto

twnaing Points 181

Que diriez-vous d'une validation personnalisée avec quelque chose comme ça?

validate :addresses_valid

def addresses_valid
  addresses.each.with_index(1) do |a, index|
    next if [a.address_line_1, a.city, a.state, a.zip].all?

    errors.add "address #{index}", "est invalide"
  end
end

En savoir plus sur Guide Rails Validation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X