我正试着在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_methodbeheaviour)。
我试图在一个控制器中调用进程请求这部分有点棘手,因为我用的是这样的东西:
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/

10-09 01:37