有没有更好的方法来验证rails中的非模型字段

时间:2015-04-09 20:28:48

标签: ruby-on-rails ruby validation

我在ROR 4应用程序中有一个表单字段,名为' measure'。它不是数据库列,但其值将通过acts_as_tree帮助模型创建自己的子条目:https://github.com/rails/acts_as_tree

我必须在“测量”时进行验证。是无效的。所以我创建了一个称为度量的虚拟属性,并仅在某种条件下检查其验证。

model someModel 
attr_accessor :measure
 validates_presence_of :measure, :if => condition? 

问题是当我保存代码时,我被抛出一个很好的验证。当我尝试在模型的某些其他方法中更新记录时,我也被抛出相同的验证。超越这一点的唯一方法是编写此代码:

   # I do not want to do this, is there a better way?
   self.measure = "someRandomvalue" 
   self.save 

我将此作为虚拟属性仅用于投掷验证。是否有更好的方法来进行验证?表单有其他验证,我不希望这种验证的错误只是因为它不是属性而以不同方式显示。

我希望它仅在通过控制器的创建和更新操作保存活动记录时进行验证,而不是在通过某种随机模型方法更新时进行验证。

1 个答案:

答案 0 :(得分:0)

我看到我团队中的其他开发人员做了类似的事情并且总是对一件事情感到好奇 - "你想要按照自己的方式做什么来做事?"。你看,我不确定是否应该将验证器用于不会被序列化的值。

无论如何,您可以尝试使用format验证程序代替presence,这在我的团队案例中有效:

# Rails 3/4
validates :measure, format: { with: /^.+$/, allow_nil: true }

# Rails 2
validates_format_of :measure, :with => /^.+$/, :allow_nil => true

您也可以尝试使用allow_blank代替allow_nil

我希望在validates_accessor_of的行中创建一个自定义验证器,用于我知道永远不会被序列化的值。

HTH