使用class_eval删除rails中的before_validation回调

时间:2017-02-08 14:29:15

标签: ruby-on-rails ruby-on-rails-4 activemodel activesupport

我的模型中有一个类写在供应商的代码中(我无法修改),其中附加了Proc。考虑一个衬衫类的示例,代码如下所示。

class Shirt < ActiveRecord::Base
  before_validation -> { self.size ||= 'medium' }
  # Some code here
end

(请注意,这段代码设置的是默认衬衫尺寸)

说,我现在需要在装饰器类中将默认衬衫大小更改为大。代码看起来像

Shirt.class_eval do
  before_validation -> { self.size ||= 'large' }
  # Some more code
end

但是,默认的衬衫尺寸仍然设置为medium,因为仍会调用原始类中的before_validation回调。

是否有一种优雅的方法来删除原始代码中的回调并使用class_eval验证?

2 个答案:

答案 0 :(得分:2)

reset_callbacks删除特定事件的所有回调:

Shirt.class_eval do
  reset_callbacks(:before_validation)
end

这是一个有点核选项,因为它删除了所有回调。但由于实际回调未命名,因此无论如何都不能跳过特定的回调。我会考虑将其修复到上游(或者如果他可以更改实现以使其更加模块化,则可以很好地询问作者。)

答案 1 :(得分:1)

您可以在设置新回调之前跳过before_validation:

Shirt.class_eval do
  skip_callback :validation, :before
  before_validation -> { self.size ||= 'large' }
  # Some more code
end