【问题标题】:Remove before_validation callback in rails using class_eval使用 class_eval 删除 rails 中的 before_validation 回调
【发布时间】:2017-02-08 14:29:14
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    reset_callbacks 删除某个事件的所有回调:

    Shirt.class_eval do
      reset_callbacks(:before_validation)
    end
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多