2010-09-10 3 views
0

Есть вложенную форму, отношения как такВложенная форма - как проверить родительскую модель на основе входных данных на дочерней модели?

class Inspection < ActiveRecord::Base 
    has_many :inspection_components 
    accepts_nested_attributes_for :inspection_components 

class InspectionComponent < ActiveRecord::Base 
    belongs_to :inspection 

У меня есть метод пользовательского Validate в проверке, которая зависит от атрибутов, введенных для InspectionComponent. Как я могу проверить - атрибуты InspectionComponent не сохраняются или не доступны для проверки для проверки.

Спасибо!

EDIT: Чтобы сделать вещи более понятными, вот пример того, что я пытаюсь сделать.

Осмотр имеет статус атрибута. InspectionComponent также имеет статус атрибута.

Форма редактирования инспекции имеет вложенные элементы InspectionComponents и позволяет обновлять статус каждой модели в этой форме. @ inspect.status должен иметь возможность отмечать «полный», если все @ inspect_component.status == «complete».

Поэтому при проверке @indpection я должен уметь видеть, что пользователь вводил для @ inspection_component.status.

Очевидно, что у меня есть доступ к параметрам обоих экземпляров контроллера, но в модели, где должна выполняться проверка, я не вижу способа сделать это.

Надеюсь, это ясно, спасибо.

+0

был моим ответом полезным? – DJTripleThreat

+0

было да, однако он не решил всю проблему, см. Мой комментарий ниже вашего сообщения ниже. Благодарю. – 46and2

ответ

0

Вы хотите использовать validates_associated.

вероятно что-то вроде:

validates_associated :inspection_components 

Выполните поиск на нем и смотреть АНИ. Есть и некоторые полезные варианты для этого метода.

+0

Привет - спасибо за ответ. Проблема здесь в том, что это все еще делает проверки независимо друг от друга. Я имею в виду, что при проверке проверки вы не знаете, что изменилось у детей InspectionComponent, и наоборот, в проверке InspectionComponent вы не уверены, что было представлено родителям Inspection. – 46and2

+0

hmm ... Мне может потребоваться больше кода, чтобы лучше понять, что вы пытаетесь сделать. Можете ли вы отредактировать свой пост или дать мне дополнительную информацию о том, что вы пытаетесь сделать? Обычно я отправляю пошаговые инструкции из 'rails my_app' в' вот такой и такой файл: 'и это дает мне хороший ответ. – DJTripleThreat

+0

Привет DJTripleThreat - Я обновил OP, надеюсь, будет более понятным, что я пытаюсь сделать, спасибо за то, что посмотрел. – 46and2

1

Хорошо, новый ответ, если другой, который я опубликовал, полезен кому-то другому. В частности, для вашей проблемы, я думаю, вам нужно что-то вроде этого:

class Inspection < ActiveRecord::Base 
    has_many :inspection_components 
    accepts_nested_attributes_for :inspection_components 

    # we only care about validating the components being complete 
    # if this inspection is complete. Otherwise we don't care. 
    validate :all_components_complete, :if => :complete 

    def complete 
    self.status == 'complete' 
    end 

    def all_components_complete 
    self.inspection_components.each do |component| 
     # as soon as you find an incomplete component, this inspection 
     # is INVALID! 
     Errors.add("field","msg") if component.status != 'complete' 
    end 
    end 
end 

class InspectionComponent < ActiveRecord::Base 
    belongs_to :inspection 
end 
+0

Привет, DJTT, еще раз спасибо. Интересно, что эта стратегия проверки действительно работает над созданием инспекции и ее InspectionComponents, но как только ситуация станет обновлением, я, похоже, не имею доступа к дочерним элементам InspectionComponents * updated * в методе проверки (all_components_complete). Когда я отлаживаю и проверяю каждый компонент inspect_, у них все еще есть старые значения. – 46and2

+0

Хорошо, позвольте мне немного подумать об этом и посмотреть, что я могу придумать. ** ИЗМЕНИТЬ: ** Я получил это, чтобы работать для меня. Если вы разместите свой адрес электронной почты, я пришлю вам электронное письмо с проектом, который я построил. Я думаю, что вы можете сделать что-то не так с вашим представлением или что-то делать с атрибутами, прежде чем пытаться их обновить. – DJTripleThreat