使用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
答案 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 ...
}