Ruby on rails 状态机的条件验证
我正在使用它构建一个多步骤表单,在转换到下一步之前验证每个步骤的字段 这是我的模型:Ruby on rails 状态机的条件验证,ruby-on-rails,ruby,ruby-on-rails-3,state-machine,Ruby On Rails,Ruby,Ruby On Rails 3,State Machine,我正在使用它构建一个多步骤表单,在转换到下一步之前验证每个步骤的字段 这是我的模型: class Foo < ActiveRecord::Base state_machine :initial => :step1 do event :next do transition :step1 => :step2 transition :step2 => :step3 end event :previous do tr
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.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
谢谢你的回答。虽然这提供了一个解决方法,但我想找出原因,因为它没有按照文档的要求运行。请参阅的“状态感知类方法”一节,我不认为验证会禁止移动到下一个状态,而是那些是处于该状态时的验证。运行
f.next
后,f.inspect
显示什么?我怀疑它处于状态2。运行f.next
后,状态仍然是“step1”。验证正在阻止转换。但是验证可能是为了阻止进入该状态,而不是退出该状态。谢谢,这就是发生的情况。
state :step2 do
validates_presence_of :field2
end
state :step2 do
validates_presence_of :field1
end
state :step3 do
validates_presence_of :field2
end
state :final do
validates_presence_of :field3
end