我正在使用state_machine构建一个多步骤表单,在转换到下一步之前验证每个步骤的字段。
这是我的模特:
class Foo < ActiveRecord::Base
state_machine :initial => :step1 do
event :next do
transition :step1 => :step2
transition :step2 => :step3
end
event :previous do
transition :step3 => :step2
transition :step2 => :step1
end
state :step1 do
validates_presence_of :field1
end
state :step2 do
validates_presence_of :field2
end
state :step3 do
validates_presence_of :field3
end
end
end
但是,这不能按预期工作:
> f = Foo.new
=> #<Foo id: nil, field1: nil, field2: nil, field3: nil, state: "step1", created_at: nil, updated_at: nil>
Foo初始化为'step1'状态。到目前为止一切都很好。
> f.next
=> false
由于验证,转换到下一步失败,正如预期的那样。
> f.errors.full_messages
=> ["Field2 can't be blank"]
然而,当我检查验证错误时,不是'Field1'未按预期验证,而是'Field2'。它似乎正在运行正在转换到的状态的验证,而不是当前状态。
我做错了什么?
非常感谢。
答案 0 :(得分:6)
我只是在猜测,但也许它会在
中运行验证state :step2 do
validates_presence_of :field2
end
尝试过渡到第2步时?
也许您不需要在第一步验证,而是将所有验证一步移动:
state :step2 do
validates_presence_of :field1
end
state :step3 do
validates_presence_of :field2
end
state :final do
validates_presence_of :field3
end