使用state_machine时应用验证异常

时间:2012-12-28 13:58:32

标签: ruby-on-rails state-machine

使用state_machine时,我无法找到在rails模型上完成验证异常的精确方法。

我的模型中有一个状态列,并通过将用户从未验证状态传递到已验证状态来处理电子邮件验证,足够简单。

我的模型包含密码的正常验证

validates :password, length: {minimum: 6}
validates :password_confirmation, presence: true

此验证很重要,但是当我将用户从未验证状态传递到验证状态时,我遇到了模型验证问题,因为我只对单个列应用更新,但与state_machine的活动记录集成似乎适用于记录更新。

state_machine片段:

state_machine :initial => :unverified do

    event :verify do
      transition :unverified => :verified
    end

因此解决方案似乎对模型验证应用了一个例外,我被吸引到:除非作为解决方案..

我实现了一些我不得不完全理解的东西,现在似乎已经删除了对密码的任何验证,显然使我的state_machine进程工作,但是没有达到我的目标..

我的更改在哪里添加:

  validates :password, length: {minimum: 6}, :unless => :proc_no_password_validation
  validates :password_confirmation, presence: true, :unless => :proc_no_password_validation

并以私人方式申请:

def proc_no_password_validation
    Proc.new { |user| user.verify }
  end

我有一种感觉,我在方向上走在正确的轨道上,但有助于发现我的错误或问题或其他解决方案将非常感激。

UPDATE 所以我得到了Jef的一些帮助,但我的结论是模型验证方法异常路由错误,我修改了我的状态代码如下:

  state_machine :state, :initial => :unverified, :action => :bypass_validation do

    event :verify do
      transition :unverified => :verified
    end

    event :unverify do
      transition :verified => :unverified
    end
  end

然后验证绕过我有兴趣忽略的状态

def bypass_validation
    if self.changes['state'][1] == 'verified'
      save!(:validate => false)
    else
      save!(:validate => true)
    end
  end

1 个答案:

答案 0 :(得分:1)

:unless接受方法名称作为符号或proc。您给出了返回Proc的方法的名称。由于Proc不是假的,因此您的除非条件得到满足并且您的验证被跳过。

你应该使用以下之一:

validates :password_confirmation, presence: true, :unless => :proc_no_password_validation
 def proc_no_password_validation
   self.verify
 end

validates :password_confirmation, presence: true, :unless => Proc.new{|user| user.verify}

<强>更新

state_machine允许您将验证包装到状态:

state :unverified { # or :verified, when should validation apply ?
  validates :password ...
  validates :password_confirmation ...
}