在运行时删除验证

时间:2015-07-02 01:11:32

标签: ruby-on-rails ruby

下面我可以成功地在运行时向Mongoid添加验证:

class Abc
  include Mongoid::Document
  field :something, type: String
end

 a = Abc.new
a.valid?
 => true 

Abc.class_eval do
  validates_presence_of :something
end
 => [Mongoid::Validatable::PresenceValidator] 
 b = Abc.new
=> #<Abc _id: 55948e466d616344a4010000, something: nil> 
b.valid?
 => false 

如何删除验证?如果可能的话,我认为ActiveRecord和Mongoid都是一样的。

我正在寻找类似的东西:

Abc.class_eval do
  remove_validates_presence_of :something
end

1 个答案:

答案 0 :(得分:2)

我认为您会在此博文中找到您想要的内容:http://gistflow.com/posts/749-canceling-validations-in-activerecord

基本上,验证器信息位于类变量_validators中,您可以调用skip_callback取消它。
所以你应该能够用

删除它
validators = Abc._validators[:something] 
v = validators.first
validators.delete v
filter = Abc._validate_callbacks.find { |c| c.raw_filter == v }.filter
skip_callback :validate, filter