【发布时间】:2012-05-03 16:53:39
【问题描述】:
在我的用户模型中,我通常怀疑电子邮件、名字、姓氏、密码等。
我有几种情况需要跳过全部或部分验证。
目前,我的除非条件类似于:
validates :first_name, presence: :true, etc..., unless: :skip_first_name_validation?
validates :last_name, presence: :true, etc..., unless: :skip_last_name_validation?
validates :email, presence: :true, etc..., unless: :skip_email_validation?
当然我也有:
attr_accessor :skip_first_name_validation, :skip_last_name_validation, etc.
然后我使用私有方法检查每个的状态:
def skip_first_name_validation?
skip_first_name_validation
end
def skip_last_name_validation?
skip_last_name_validation
end
def skip_email_validation?
skip_email_validation
end
etc..
从那里开始,每当我需要跳过验证时,我只需在我的控制器中为每个人分配一个 true 值。
虽然所有这些都可以正常工作,但我想知道是否有更优雅的方式?
理想情况下,如果我可以对模型中的每个属性使用这样的简单条件,那就太好了:
:skip_validation?
在我的控制器中,只需执行以下操作:
skip_validation(:first_name, :last_name, :password) = true
有人可以就我如何编程提出建议吗?我不想使用现有的 gem/库,但我想了解如何在 rails 中编程这种行为。谢谢。
【问题讨论】:
-
这就是 DCI 的全部意义所在。否则,state_machine 不适合吗?
-
我认为这取决于您如何更新模型。例如,您可以使用
update_column方法一次更新 1 列,从而跳过验证。 -
这像 update_attribute 吗?我认为这也不是很干净,因为现在我的控制器会被一系列这些方法调用弄乱。理想情况下,我有一种方法可以将参数传递给控制器,例如:skip_validation(用户名、电子邮件、密码等)。坦率地说,我有点惊讶这样的事情不存在带有导轨的 OOTB,但这并不是真正的问题。我想知道如何在 Rails 中进行编程。
-
取决于您跳过验证的内容?
-
嗯...我想我在问问题时没有添加足够的清晰度,或者问题太复杂了。