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
我想知道为什么会出现此错误以及如何解决此错误。谢谢。
答案 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