Я пишу волшебную форму в рельсах;например, несколько входных страниц для одного модельного объекта.
Основы моего подхода описаны в многоступенчатой форме railscast Райана Бейтса: http://railscasts.com/episodes/217-multistep-forms (на случай, если кто-то захочет узнать ПОЧЕМУ за кодом, приведенным ниже).
Объекты, находящиеся под пристальным вниманием, здесь: «Участник», у которого есть один «Адрес»
Моя проблема в том, что я хочу проверять вложенный объект (Адрес) только тогда, когда пользователь пытается пройти мимо экрана ввода адреса,В настоящее время это отслеживается с помощью атрибута в модели Участника, который называется "current_step"
Итак, у меня есть Участник:
class Participant < ActiveRecord::Base
has_one :address
accepts_nested_attributes_for :address
validates_presence_of :first_name, :last_name, :if => self.current_step == "name"
...
def steps = %w[ name address confirm ] # the steps the wizard will follow
end
И Адрес:
class Address < ActiveRecord::Base
belongs_to :participant
validates_presence_of :address1, :state, :suburb, :postcode #, :if => participant.current_step == "address"
end
Принцип такого подхода заключается в том, что действие «создать» вызывается на контроллере (не показан) для каждого шага мастера, и оно проверяет только подмножество модели при обработке каждого шага.
В настоящее время, когдаЯ заполняю первый экран («имя») и пытаюсь перейти на шаг адреса, проверка адреса запускается, и я возвращаюсь на экран «имя» с ошибками проверки для пустых деталей адреса.
Итак, я попробовал несколько подходов, заключительной частью которого было закомментированное условие проверки адреса, показанное выше - я обнаружил, что это не работает, так как я только строю объекты Member-> Address, но неспасая их.Поэтому @participant.address
возвращает мне объект адреса, но @participant.address.participant
является нулевым, поскольку у адреса еще нет внешнего ключа member_id для поиска его родителя.
Причиной моей борьбы является включениесупер удобный метод accepts_nested_attributes_for
.Я ожидал использовать validates_associated
для выполнения проверки, но я вижу, что тег accepts_nested_attributes_for
хорошо передает оба параметра формы для создания вложенных объектов модели, но также обеспечивает вызов метода participant#valid?
вплоть до проверки адреса вВСЕ ситуации.
Итак, моя дилемма в том, как наилучшим образом использовать метод participant#valid?
для проверки частично полной модели, основанной на параметре current_step
в участнике?
РЕДАКТИРОВАТЬ - обновлено, чтобы удалить дополнительную информацию и перейти к основной проблеме