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