1

我正在尝试在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 的新手,不知道我应该提供什么样的细节。

4

2 回答 2

3

也许你想用另一种方式来做

文件patch_classes.rb:

module ActiveMerchant展开
  模块运输
    模块类方法
      def self.process_request(receiver, sender, packages, options = {})
        # 一些代码
      结尾
    结尾

    模块实例方法
      def 常规方法
        “美食吧”
      结尾
    结尾

    def self.included(接收者)
      receiver.extend 类方法
      receiver.send :include, InstanceMethods
    结尾
  结尾
结尾

然后你必须加载你的类“ActiveMerchant::Shipping::UPS”,然后你可以通过你的方法将你的方法附加到你的类

Rails.configuration.to_prepare 做
  require_dependency [[ActiveMerchant::Shipping::UPS 的文件]]
  需要'patch_classes')
  ActiveMerchant::Shipping::UPS.send(:include, ::ActiveMerchantExpand::Shipping)
结尾

这是来自rails插件的写作,我希望这会有所帮助。

关于 tingel2k

于 2013-04-04T08:39:09.187 回答
1

您是否明确require提交了猴子补丁?如果您只是将它放在您的应用程序或 lib 路径下而不需要,它不会加载,因为常量ActiveMerchant::Shipping::UPS是在 gem 中定义的并且它不会触发依赖解析机制。

于 2012-08-23T15:42:30.417 回答