1

有人可以解释一下,如何用验证来做向导式的表单吗?

费:

我有一个约会模型,其中应包括以下数据:姓名、开始时间、结束时间、地址、城市。

现在我想为每个数据组执行 3 个操作:

  1. 姓名
  2. 开始和结束日期
  3. 地址字段

它们中的每一个都应该是可访问的(所以我认为 AASM 不是一个选项-> model.wizard_step = 3 并且为此步骤生成正确的视图还不够)。

他们每个人都应该有验证

  1. 名字不应该是零
  2. 开始日期不能晚于结束日期
  3. 地址字段不能为 nil

但是我如何在单个步骤之间保存这个对象,以及如何在这个验证模式/组中构建......?

heeelp..谢谢=)

4

4 回答 4

3

您可以为此使用 Grouped Validations gem:https ://github.com/adzap/grouped_validations

于 2011-04-19T16:58:35.657 回答
1

在表单中组合一个隐藏字段:

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
于 2009-06-16T21:22:24.237 回答
0

你将不得不在这个上基本上“自己动手”。最接近标准 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

而且您必须将每个步骤中的变量传递到下一步的隐藏字段中。您可能还想考虑只在一个阶段而不是三个阶段执行此操作。

于 2009-06-04T12:58:08.577 回答
0

你不能只使用 :if 吗?

例如

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
于 2009-06-04T13:00:59.163 回答