0

使用 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

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

更新所以我得到了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
4

1 回答 1

1

:unless接受方法名称作为符号或过程。您给出了返回 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 ...
}
于 2012-12-28T14:12:20.543 回答