Ruby on Rails:如何在调用super方法时覆盖gem中的方法

时间:2017-10-20 10:24:43

标签: ruby-on-rails ruby

Mongoid::Persistable::Creatable::ClassMethods.module_eval do
  def create(attributes = nil, &block)
    begin
      super
    rescue Mongo::Error::OperationFailure => e
      Rails.logger.error "failed to create notifications #{e.message}, #{e.backtrace}"
      raise
    end
  end
end

大家好,我正在尝试从mongoid gem覆盖一个方法。所以我在config/initializers/mongo.rb中实现了上述方法, 期望我的create方法按照gem中的定义运行,同时留下错误日志以防有Mongo::Error::OperationFailure。但相反,它给了我这个错误。

[1] pry(main)> Notification.create(id: 'ididididididid')
NoMethodError: super: no superclass method `create' for Notification:Class

我想知道为什么会出现此错误以及如何解决此错误。谢谢。

1 个答案:

答案 0 :(得分:6)

猴子直接修补它是hacky并完全覆盖该方法。您希望super调用原始实现,但它不再存在。而是创建一个新模块并将其包含在那里:

module CreateWithErrorLogging
  def create(attributes = nil, &block)
    begin
      super
    rescue Mongo::Error::OperationFailure => e
      Rails.logger.error "failed to create notifications #{e.message}, #{e.backtrace}"
      raise
    end
  end
end

Mongoid::Persistable::Creatable::ClassMethods.include CreateWithErrorLogging