Многостраничные формы в Rails
-
03-07-2019 - |
Вопрос
У меня довольно сложная модель со многими полями, has_many
ассоциации, изображения добавил image_column
и т. д...
Новый объект будет добавлен в виде многостраничной формы (8 шагов). Как мне выполнить проверку и распространение между этими шагами?
Я думаю validation_group
может быть полезно для определения проверок для каждого шага, а как насчет общего дизайна?
Решение
Для общего дизайна вы можете рассмотреть концепцию слоя Presenter (Джей Филдс определяет ее в своей записи в блоге). Рельсы:Шаблон презентации) как способ сделать ваши контроллеры тонкими и сделать представления глупыми при работе со сложными/множественными моделями.
Другие советы
У вас может быть ряд методов, например. step_1
, step_2
, и каждый проверяет, были ли отправлены необходимые данные с предыдущего шага.Вы можете хранить данные в сеансе, чтобы, например, шаг 3 по-прежнему имел доступ ко всем данным, собранным и проанализированным на шаге 1.На последнем этапе поместите все данные, которые вы сохранили в сеансе, а также данные из предпоследнего шага, чтобы использовать их, и создайте новую строку в базе данных или там, для чего вы собираете данные.Если пользователь испортил шаг, перенаправьте его на предыдущий шаг и заполните для него форму теми данными, которые он заполнил;напримересли пользователь испортил шаг 2 и отправил форму, ведущую к шагу 3, устраните проблему в своем step_3
метод, перенаправить пользователя на step_2
и убедитесь, что элементы формы на шаге 2 предварительно заполнены.
Если вы не хотите хранить данные в сеансе по ходу, вы можете создать новую строку базы данных после того, как пользователь отправил шаг 1, и просто обновлять поля в этой строке по мере сбора новых данных на каждом последующем шаге.Вы можете установить в строке некоторый флаг «завершено», сначала установив его на 0, а затем установив на 1 после того, как пользователь успешно выполнил все шаги.
Вы также можете разрешить пользователям переходить к предыдущим шагам (например,позвольте пользователю вернуться к шагу 3, когда он находится на шаге 5).
Допустим, ваш первый шаг представляет собой форму с полями «имя» и «электронная почта».В вашей step_2
метод, вы должны убедиться, что params[:name]
и params[:email]
были приняты и действительны.Сохраните их в сеансе или строке базы данных по вашему выбору.Затем на шаге 2 у вас появится форма с полями «возраст» и «пол».В вашей step_3
метод, вы должны убедиться, что params[:age]
и params[:gender]
были переданы и действительны, и вам также необходимо убедиться, что пользователь выполнил шаг 1, чтобы пользователь не мог ввести URL-адрес для прямого доступа к шагу 3.И так далее.
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
работа еще продолжается, но я чувствую, что нахожусь на правильном пути.я использую ААСМ состояния, чтобы определить, какие проверки выполнять.Я до сих пор не разобрался, как должны работать маршруты, так как рассматриваемая модель в моем случае является ресурсом.например, какая группа полей должна быть действием редактирования?