вложенная форма - как проверить родительскую модель на основе входных данных дочерней модели? - PullRequest
0 голосов
/ 10 сентября 2010

имеют вложенную форму, отношения такие, как у

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

class InspectionComponent < ActiveRecord::Base
  belongs_to :inspection

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

Спасибо!

РЕДАКТИРОВАТЬ: Чтобы сделать вещи немного яснее, вот пример того, что я пытаюсь сделать.

Инспекция имеет статус атрибута. InspectionComponent также имеет статус атрибута.

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

Следовательно, при проверке @inspection я должен иметь возможность видеть, что пользователь ввел для @ inspe_component.status.

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

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

Ответы [ 2 ]

1 голос
/ 10 сентября 2010

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

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 голосов
/ 10 сентября 2010

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

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

validates_associated :inspection_components

Выполните поиск по нему и найдите API.У этого метода также есть несколько полезных опций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...