Группы проверки для форм в стиле мастера - PullRequest
1 голос
/ 04 июня 2009

Может кто-нибудь объяснить мне, как сделать формы в стиле мастера с проверками?

f.e:.

У меня есть модель встречи, которая должна включать следующие данные: имя, время начала, время окончания, адрес, город.

Теперь я хочу иметь 3 действия для каждой группы данных:

  1. имя
  2. начало и конец
  3. адрес-поля

каждый из них должен быть доступен (поэтому я считаю, что AASM не вариант -> model.wizard_step = 3, и генерация правильного представления для этого шага недостаточно).

И каждый из них должен иметь проверки

  1. имя не должно быть ноль
  2. дата начала не должна быть позже даты окончания
  3. поля адреса не должны быть равны нулю

но как мне сохранить этот объект между отдельными шагами и как встроить эти схемы / группы проверок ...?

heeelp .. спасибо =)

Ответы [ 4 ]

3 голосов
/ 19 апреля 2011

Для этого вы можете использовать гем Сгруппированные проверки: https://github.com/adzap/grouped_validations

1 голос
/ 17 июня 2009

Объедините скрытое поле в вашей форме:

f.hidden_field :wizard_stage, :value => '<current action>'

с чем-то вроде этого

class Appointment < ActiveRecord::base

   attr_accessor :wizard_stage

   validates_presence_of :name, :if => lambda{|a| a.wizard_stage == 'name'}
   validates_presence_of [:start, :end], :if => lambda{|a| a.wizard_stage = 'dates'}
end
0 голосов
/ 04 июня 2009

вы не можете просто использовать: если?

, например

validates_presence_of :name
validates_presence_of :address_fields, :if => Proc.new {|p| p.startdate && p.enddate}

def validate
  unless name.blank?
    errors.add(:startdate) if startdate > enddate 
  end
end
0 голосов
/ 04 июня 2009

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

class WizardController < ApplicationController
  def wizard_1
    foo = Foo.new params[:foo]
    foo.valid?

    if %{name}.any? {|att| foo.errors.on(att) }
      # failed pseudo-validation
    else
      render :wizard_2
    end
  end

  def wizard_2
    foo = Foo.new params[:foo]
    foo.valid?

    if %{name startdate enddate}.any? {|att| foo.errors.on(att) }
      # failed pseudo-validation
    else
      render :wizard_3
    end
  end

  def wizard_3
    # standard rails Controller#create
  end
end

И вам придется передавать переменные каждого шага в скрытые поля следующего. Вы также можете рассмотреть возможность сделать это в один этап, а не в три.

...