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