我正在使用 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”。它似乎正在为正在转换到的状态而不是当前状态运行验证。
我做错了什么?
非常感谢。
最佳答案
我只是猜测,在这里,但也许它运行验证
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
关于ruby-on-rails - 使用 state_machine 进行条件验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4523431/