我的模型中有一个类写在供应商的代码中(我无法修改),其中附加了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验证?
答案 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