【发布时间】:2012-08-19 03:53:43
【问题描述】:
我正在尝试在 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 行为)。
我尝试在我的一个控制器中调用 process_request。这部分有点棘手,因为我正在使用这样的东西:
MyModel.courier_service.process_request(parameters)
其中courier_service,在这种情况下包含ActiveMerchant::Shipping::UPS 类。
我还是 Ruby 的新手,不知道我应该提供什么样的细节。
【问题讨论】:
标签: ruby class monkeypatching