Rails传递一个表单参数来确定是否进行验证

时间:2015-02-04 19:24:10

标签: ruby-on-rails validation ruby-on-rails-4

我试图有选择地对模型强制执行验证。我希望模型在从用户输入数据时强制执行它们,但是在运行文件时我想有时忽略验证。当我从Web用户添加时,我提出了一种将布尔值设置为TRUE的智能方法。看起来很棒,直到我需要从文件更新,现在我基本上必须在所有记录上切换布尔值。以下是我的一些代码:

class Identity < ActiveRecord::Base

   validate :validate_spouse_age, :if => "web_add?"
   validates :ssn, length: { is: 9 }

   def validate_spouse_age
      if (relationship == "S" || relationship == "DP") && !dob.nil? && web_add? && age<16
      errors.add(:dob, :spouse_under_age)
    end
    true
   end
end

因此,在网络表单上,我只需添加一个hidden_​​fiedl设置&#39; web_add&#39;为true,验证运行并保存到记录中。但是现在当我想运行以下内容时,我必须将布尔值设置为false,否则验证仍会运行。

identity.web_add=false #to allow it to be updated without validation fails
identity.update_attributes!(
    namefirst:          line.FIRST_NAME,
    namelast:           line.LAST_NAME
    )

我确信有一种更聪明的方法可以做到这一点。为什么我不仅完全忽略验证,还是有一些我想要运行的验证,无论数据源是什么。例如,SSN需要存在或者应该失败。

任何帮助都会更受欢迎!!!

1 个答案:

答案 0 :(得分:1)

您可以跳过整个&#39; web_add&#39;布尔值并在非Web方法中使用update_attribute方法。您将需要单独更新每个属性,但它将跳过验证并将更改提交到数据库。你可以实现类似的东西:

instance.update_attribute(name, value)

在你的情况下

identity.update_attribute(:namefirst, line.FIRST_NAME)
identity.update_attribute(:namelast, line.LAST_NAME)

当网络用户提交表单时,验证将正常运行。运行update_attribute方法时,将跳过验证。

此处列出了skip activerecord validations可用的所有方法:

decrement!
decrement_counter
increment!
increment_counter
toggle!
touch
update_all
update_attribute
update_column
update_counters