使用state_machine进行条件验证

时间:2010-12-24 00:14:13

标签: ruby-on-rails ruby ruby-on-rails-3 state-machine

我正在使用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'。它似乎正在运行正在转换到的状态的验证,而不是当前状态。

我做错了什么?

非常感谢。

1 个答案:

答案 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