有人可以解释一下,如何使用验证进行向导式表格?
f.e:
我有一个约会模型,其中应包括以下数据: 姓名,开始时间,结束时间,地址,城市。
现在我希望每个数据组有3个操作:
每个都应该是可访问的 (所以我认为AASM不是一个选项 - > model.wizard_step = 3并为此步骤生成正确的视图是不够的。)
他们每个人都应该有验证
但是如何在单个步骤之间保存此对象,以及如何构建此验证模式/组...?
heeelp .. 谢谢=)
答案 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