获取Rails模型的验证

3

如果一个模型在model_name.rb文件中有验证,我如何手动访问这些验证?我想烹制自己的表单验证系统,使其与内置的Rails技巧一起工作,并尽可能地保持DRY。我的主要问题是,在任何表单值进入数据库之前,我需要进行服务器端验证(我正在使用多步表单)。

基本上,我想知道是否有像

User.validations.each do |v|
    puts v.constraint.to_s + " " + v.message
end

有类似的东西吗?

提前谢谢。

3个回答

1
我的主要问题是我需要在表单值进入数据库之前对服务器进行验证(我使用多步骤表单)。
如果根据类文件中的验证,您的模型无效,则其数据将不会保存到数据库中(除非您通过将false传递给save方法来抑制验证)。
您可以通过调用valid?/invalid?方法,在任何时候询问模型是否有效。

我的表单大约有4个步骤。在第三步左右之前,没有任何模型调用.save方法。然而,我仍然需要进行一些基本验证(例如,用户被呈现几个复选框以供选择。如果没有选择任何框,则需要输出错误等)。 即使没有调用保存,这些验证是否仍然会被调用? - user94154

0

在调用valid?方法后,ActiveRecord对象会暴露出errors方法,该方法会告诉你哪些验证被违反了。你可以检查valid?,然后检查你所在表单部分的任何字段是否无效。 对于具有field1和field2字段的表单,你可以这样做。

unless x.valid?
  [:field1,:field2].each do |field|
    yes_there_was_an_error if x.errors[field]
  end
end

0

你最好使用状态机,并在表单的各个步骤之间将数据存储在数据库中。

你可以这样做:validates_presence_of :username, :if => proc {|u| u.signup_step >= 2 },其中signup_step是数据库中的一个整数列。

因此,即使你说你不想在表单之间将数据存储在数据库中,我认为你也应该这样做。如果你这样做,你就可以使用常规验证和模型,而无需进行恶意黑客攻击。而且,老实说,我不认为以这种方式处理会有问题。


非常巧妙!我想我会尝试一下...而且我已经使用会话在数据库中存储了...我想我应该更清楚地表达--直到某个步骤,我才将其作为ActiveRecord对象存储在数据库中。谢谢! - user94154

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接