我正试着在ActiveShipping UPS class里给猴子打补丁。
我需要添加一个类级别的方法(从.self
开始),所以我要做的是:
module ActiveMerchant
module Shipping
class UPS < Carrier
def self.process_request(receiver, sender, packages, options = {})
# some code
end
def regular_method
"foobar"
end
end
end
end
不幸的是,当我试图使用它时:
ActiveMerchant::Shipping::UPS.process_request(receiver etc)
我得到一个错误:
NoMethodError: undefined method `process_request' for ActiveMerchant::Shipping::UPS:Class
from (irb):6
from C:/Ruby19/bin/irb.bat:19:in `<main>'
原始类中没有名为
process_request
的类方法。在gem提供的原始UPS类中,定义了一个静态方法
self.retry_safe = true
我可以毫无错误地使用它。
我也可以在创建ups类实例后使用
regular_method
。提供更多详细信息:
我正在使用Rails 2.3(:-)和Ruby 1.9.2我对环境没有影响。
猴子补丁代码低于
plugins/my_plugin/lib/active_shipping/ext/carriers/ups.rb
在/active_shipping中,我有一个名为extensions.rb的文件,其中:
require 'active_shipping'
require_relative 'ext/carriers'
require_relative 'ext/carriers/ups'
它处理正确地加载所有内容(我想基于我问题中第一段代码的
regular_method
beheaviour)。我试图在一个控制器中调用进程请求这部分有点棘手,因为我用的是这样的东西:
MyModel.courier_service.process_request(parameters)
其中
courier_service
,在本例中包含ActiveMerchant::Shipping::UPS
类。我还是ruby的新手,不知道应该提供什么样的细节。
最佳答案
也许你想用另一种方式
文件patch_classes.rb:
模块activemerchantexpand
模块运输
模块类方法
def self.process_请求(接收方、发送方、包、选项={})
#一些代码
结束
结束
模块实例方法
def正则法
“美食家”
结束
结束
自含def(接收器)
Receiver.extend类方法
receiver.send:包含,实例方法
结束
结束
结束
然后您必须加载类“ActiveMerchant::Shipping::UPS”
然后你可以通过
Rails.configuration.to_准备
需要依赖关系[[activemerchant::shipping::ups的文件]]
需要“补丁类”)
activemerchant::shipping::ups.send(:include,::activemerchantexpand::shipping)
结束
这是rails插件编写的,希望能有所帮助。
问候tingel2k
关于ruby - 猴子补丁类方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12094905/