ruby-on-rails - 使用 state_machine 进行条件验证

标签 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”。它似乎正在为正在转换到的状态而不是当前状态运行验证。

我做错了什么?

非常感谢。

最佳答案

我只是猜测,在这里,但也许它运行验证

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/

相关文章:

ruby-on-rails - 如何使用 Rails 中的 Paperclip 将文件系统中的图像添加到模型中?

ruby-on-rails - Rails has_and_belongs_to_many 集合方法未显示在对象上

ruby - bundle 与 bundle install 相同吗?

ruby - Heroku 控制台奇怪的日期问题

ruby-on-rails - Heroku 网站因 Rails 3.2.9 和路由约束而崩溃

mysql - 已安装 C MySQL gem 时使用基于 Ruby 的 MySQL 适配器?

JQuery UI Accordion 标题未正确呈现

arrays - 运算符 Array#<< 以 reduce 的简写形式失败

ruby-on-rails - Rails 3错误: no such file to load -- initializer (LoadError)

javascript - 如何在 Rails 应用程序中显示 d3.js 圆包图?