我正在尝试在ActiveShipping UPS 类中进行一些猴子修补。
我需要添加一个类级别的方法(以 开头.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
,我可以毫无错误地使用它。
我也可以regular_method
在创建 UPS 类的实例后使用。
提供了更多详细信息:
我正在使用 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
我问题中第一块代码的行为)。
我尝试在我的一个控制器中调用 process_request。这部分有点棘手,因为我正在使用这样的东西:
MyModel.courier_service.process_request(parameters)
其中courier_service
, 在这种情况下持有ActiveMerchant::Shipping::UPS
类。
我仍然是 Ruby 的新手,不知道我应该提供什么样的细节。