2012-09-17 9 views
5

Dada la relación se expresa a continuación:¿Es posible acceder a un objeto secundario a partir de los errores en un padre de registros activo?

class Parent < ActiveRecord::Base 
    has_many :children, :dependent => :destroy 

    accepts_nested_attributes_for :child 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 

    validates :name, :presence => true 
end 

Supongamos que tenemos un objeto padre con varios hijos, uno o más de los cuales tienen errores que causan parent.valid? para devolver falso.

parent = Parent.new 
parent.build_child(:name => "steve") 
parent.build_child() 
parent.valid? 

¿Hay alguna manera de acceder al elemento secundario que provocó los errores al mirar el objeto parent.errors?

+1

Se podía mirar por encima de los niños ... –

Respuesta

0

Como John sugirió en los comentarios, terminé haciendo caso omiso de los errores añadidos a los padres de los niños y atravesando los niños y añadiendo sus errores de forma manual. El problema se complicó al tener un par de has_many: a través de las relaciones, pero la sugerencia de John fue la esencia de lo que terminé usando.

+0

Si no le importa, puede mostrar cómo se ignoran los errores para los objetos secundarios? – Mohamad

+0

@Mohamad Estaba creando un hash secundario de errores, por lo que ignorar los errores para los niños era tan simple como ignorar todos los errores donde key.split ('.'). Size> 1 – biagidp

1

Sí, podría hacerlo. Añadir a su modelo

validates_associated :children 

Parent Después de eso se le puede llamar errors método en niños de todos los padres para encontrar errores de validación. Algo como esto para ver los mensajes de error niño

parent = Parent.new 
parent.build_child 
parent.valid? 
parent.children.first.errors.messages 
0

Adición de mi solución como espero que sea útil:

class Parent < AR 
    has_many :children, inverse_of: :parent 
    validates_associated :children, message: proc { |_p, meta| children_message(meta) } 

    def self.children_message(meta) 
    meta[:value][0].errors.full_messages[0] 
    end 
    private_class_method :children_message 
end 

class Child < AR 
    belongs_to :parent, inverse_of: :children 
    validates :name, presence: true 
end 
Cuestiones relacionadas