向导式表单的验证组

时间:2009-06-04 10:29:59

标签: ruby-on-rails ruby ruby-on-rails-plugins

有人可以解释一下,如何使用验证进行向导式表格?

f.e:

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

现在我希望每个数据组有3个操作:

  1. 姓名
  2. 开始和结束
  3. 地址字段
  4. 每个都应该是可访问的 (所以我认为AASM不是一个选项 - > model.wizard_step = 3并为此步骤生成正确的视图是不够的。)

    他们每个人都应该有验证

    1. 名称不应为零
    2. startdate不得在enddate之后
    3. 地址字段不得为零
    4. 但是如何在单个步骤之间保存此对象,以及如何构建此验证模式/组...?

      heeelp .. 谢谢=)

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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

答案 2 :(得分: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

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

答案 3 :(得分:0)

你不能只使用:if?

e.g。

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