Вопрос

У меня довольно сложная модель со многими полями, 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top