2012-09-17 13 views
5

Biorąc pod uwagę zależność przedstawiono poniżej:Czy można uzyskać dostęp do obiektu podrzędnego z błędów w aktywnym rekordzie rodzica?

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 

Załóżmy, że mamy obiekt nadrzędny z wieloma dziećmi, jednego lub więcej, które mają błędy, które powodują parent.valid? zwrócić false.

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

Czy istnieje sposób dostępu do elementu potomnego, który spowodował błędy podczas przeglądania obiektu parent.errors?

+1

Można patrzeć na dzieci ... –

Odpowiedz

0

Jako John zasugerował w komentarzach, skończyło się na ignorowanie błędów dodane do rodzica dla dzieci i przejeżdżające dzieci i dodanie ich błędy ręcznie. Kwestia była skomplikowana, ponieważ para miała wiele: przez relacje, ale sugestia Johna była esencją tego, z czego skorzystałem.

+0

Jeśli nie przeszkadza, można pokazać, w jaki sposób ignorować błędy dla obiektów podrzędnych? – Mohamad

+0

@Mohamad Tworzyłem dodatkowy skrót błędów, więc ignorowanie błędów dla dzieci było tak proste, jak ignorowanie wszystkich błędów, w których key.split ("."). Size> 1 – biagidp

1

Tak, możesz to zrobić. Dodaj do swojej Parent modelu

validates_associated :children 

Po tym można nazwać errors metody na każdy rodzic dziecka, aby znaleźć błędy sprawdzania poprawności. Coś takiego zobaczyć komunikaty o błędach dziecko

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

Dodawanie moje rozwiązanie, jak mam nadzieję, że to pomocne:

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 
Powiązane problemy