【问题标题】:Get validations of a Rails model获取 Rails 模型的验证
【发布时间】:2009-06-16 16:13:58
【问题描述】:

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

基本上我想知道是否有类似的方法

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

有没有类似的?

提前致谢。

【问题讨论】:

    标签: ruby-on-rails validation model


    【解决方案1】:

    我的主要问题是我需要 服务器端验证之前的任何 表单值命中数据库(我是 使用多步表单)。

    如果您的模型根据其类文件中的验证无效,则其数据将不会保存到数据库中(除非您将 false 传递给 save 方法以禁止验证)。

    • 您可以随时通过调用其valid?/invalid? 方法来询问模型是否有效。

    【讨论】:

    • 我的表单大约有 4 个步骤。在第三步之前,没有模型调用 .save 方法。但是,我仍然需要做一些基本的验证(即,向用户展示了几个复选框项目以供选择。如果没有选中任何框,我需要输出错误等)。在不调用 save 的情况下仍然会调用验证吗?跨度>
    【解决方案2】:

    ActiveRecord 对象在valid 后暴露errors 方法?被调用,它会为您提供有关违反哪些验证的消息。你可以检查有效吗?然后检查您所在的表格部分是否有任何字段无效。 您可以对具有字段 field1 和 field2 的表单执行类似操作。

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

    【讨论】:

      【解决方案3】:

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

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

      因此,即使您说您不想将其存储在表单之间的数据库中,我认为您应该这样做。如果你这样做,你可以使用常规的验证和模型,而没有讨厌的黑客攻击。老实说,我怀疑这样做有问题。

      【讨论】:

      • 非常漂亮!我想我会试一试...而且我已经通过会话存储在数据库中...我想我应该更清楚 - 我不会将它作为 ActiveRecord 对象存储在数据库中,直到一定的步骤。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      相关资源
      最近更新 更多