Многостраничные формы в Rails - PullRequest
5 голосов
/ 14 октября 2008

У меня довольно сложная модель с множеством полей, has_many ассоциаций, изображений, добавленных image_column и т. Д. *

Новый объект будет добавлен многостраничной формой (8 шагов). Как выполнить проверку и распространение между этими шагами?

Я думаю, validation_group может быть полезно для определения валидации для каждого шага, как насчет общего дизайна?

Ответы [ 3 ]

6 голосов
/ 14 октября 2008

Для общего дизайна, вы можете захотеть взглянуть на концепцию уровня Presenter (Jay Fields определяет его в своей записи в блоге Rails: Presenter Pattern ) как способ сохранить ваши контроллеры тонкими и делать глупые представления при работе со сложными / множественными моделями.

4 голосов
/ 12 декабря 2008

Вы можете иметь ряд методов, например, step_1, step_2, и каждый проверяет, что были отправлены необходимые данные из предыдущего шага. Вы можете сохранить данные в сеансе, чтобы, например, на шаге 3 по-прежнему имелся доступ ко всем данным, собранным и проанализированным на шаге 1. На последнем шаге поместите все данные, которые вы сохранили в сеансе, плюс данные от предпоследнего шага, который нужно использовать, и создайте новую строку в базе данных или что бы вы ни собирали данные. Если пользователь испортил шаг, перенаправьте его на предыдущий шаг и заполните для него форму с данными, которые он заполнил; например если пользователь испортил шаг 2 и отправил форму, ведущую к шагу 3, поймайте проблему в своем методе step_3, перенаправьте пользователя в метод step_2 и убедитесь, что элементы формы в шаге 2 предварительно заполнены.

Если вы не хотите сохранять данные в сеансе по ходу дела, вы можете создать новую строку базы данных после того, как пользователь отправил шаг 1, и просто обновить поля в этой строке по мере сбора новых данных на каждом последующем шаге. , В строке может быть установлен флажок «завершено», сначала установите его в 0, а затем установите в 1 после того, как пользователь успешно завершил все шаги.

Вы также можете разрешить пользователям переходить к предыдущим шагам (например, позволить пользователю вернуться к шагу 3, когда он находится на шаге 5).

Скажем, у вашего первого шага есть форма с полями 'name' и 'email'. В вашем методе step_2 вы должны убедиться, что params[:name] и params[:email] были переданы и действительны. Сохраните их в сеансе или строке базы данных, как вы выбрали. Затем на шаге 2 у вас есть форма с полями «возраст» и «пол». В вашем методе step_3 вы должны убедиться, что params[:age] и params[:gender] были переданы и действительны, а также вам необходимо убедиться, что пользователь выполнил шаг 1, чтобы пользователь не мог ввести URL-адрес для доступа к шагу 3 непосредственно. И так далее.

0 голосов
/ 02 февраля 2009
class Campaign < ActiveRecord::Base
    with_options(:if => lambda { |campaign| campaign.on_or_past_step(:spam_can) }) do |spam_can|
      spam_can.validates_associated  :spam_can
      spam_can.validates_presence_of :spam_can
    end
  def on_or_past_step
   :
   :
  end
end

это работа в процессе, но я чувствую, что на правильном пути. Я использую AASM состояния, чтобы определить, какие проверки нужно запустить. Я до сих пор не выяснил, как должны работать маршруты, поскольку рассматриваемая модель в моем случае является ресурсом. например, в какой группе полей должно быть действие редактирования?

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