2012-12-03 11 views
5

Mam formularz z zagnieżdżonymi atrybutami. Teraz w moim oświadczeniu :reject_if => chciałbym sprawdzić atrybut w modelu zagnieżdżonym, powiedzmy first_record? Czy istnieje sposób dostępu do takiej metody? Wydaje mi się, że możesz uzyskać dostęp tylko do przesłanego atrybutu atrybutu, aby sprawdzić, czy pole jest puste, na przykład. Dzięki!szyny accepts_nested_attributes i: reject_if

+0

Należy pamiętać, że reject_if odrzuca tylko zmiany zagnieżdżonych atrybutów, nie spowoduje to błędu podczas zapisywania modelu ze źle zagnieżdżoną wartością atrybutu. Jeśli chcesz uzyskać błąd w przypadku źle zagnieżdżonych atrybutów, po prostu dodaj weryfikację do modelu zagnieżdżonego, a następnie zwróci błąd podczas zapisywania modelu nadrzędnego. –

Odpowiedz

5

Według docs http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

Alternatywnie: reject_if akceptuje również symbol za pomocą metod:

class Member < ActiveRecord::Base 
    has_many :posts 
    accepts_nested_attributes_for :posts, :reject_if => :new_record? 
end 

class Member < ActiveRecord::Base 
    has_many :posts 
    accepts_nested_attributes_for :posts, :reject_if => :reject_posts 

    def reject_posts(attributed) 
    attributed['title'].blank? 
    end 
end 

ten powinien pracować dla Ciebie. Zasadniczo oznacza to, że w funkcji niestandardowej możesz zrobić wszystko, co chcesz.

+0

Tak, ale wywoływana metoda znajduje się w modelu członkowskim. Chciałbym wywołać metodę na budowanym obiekcie zagnieżdżonym. Na przykład chciałbym powiedzieć "accepts_nested_attributes_for: posts,: reject_if => post.first_record?" Zakładając, że 'Post' ma metodę' first_record? '. Nie jestem pewien, czy obiekt będący w trakcie kompilacji jest dostępny w ten sposób, czy też ': reject_if =>' jest wywoływana przed faktycznym budowaniem obiektu ...? – Kasper

+2

Cóż, rozwiązałem problem w inny sposób. Ale nadal jestem ciekawy, czy obiekt zagnieżdżony jest dostępny dla ': reject_if'. – Kasper