1

ActiveShippingUPSクラスでモンキーパッチを適用しようとしています。

クラスレベルのメソッド(で始まる.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クラスには、1つの静的メソッドが定義されself.retry_safe = true ており、エラーなしで使用できます。

regular_methodUPSクラスのインスタンスを作成した後にも使用できます。

提供される詳細:
Rails 2.3(:-()およびRuby1.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それはすべてを適切にロードすることを扱います(私の質問のコードの最初のチャンクからの振る舞いに基づいていると思います)。

コントローラの1つでprocess_requestを呼び出そうとしました。この部分は少しトリッキーです。なぜなら、私は次のようなsthを使用しているからです。

MyModel.courier_service.process_request(parameters)

ここcourier_serviceで、この場合はActiveMerchant::Shipping::UPSクラスを保持します。

私はまだRubyの初心者であり、どのような詳細を提供すべきかわかりません。

4

2 に答える 2

3

たぶん、あなたはそれを別の方法でやりたいと思っています

ファイル patch_classes.rb:

モジュール ActiveMerchantExpand
  モジュールの配送
    モジュール ClassMethods
      def self.process_request(受信者、送信者、パッケージ、オプション = {})
        # いくつかのコード
      終わり
    終わり

    モジュール InstanceMethods
      def regular_method
        「フーバー」
      終わり
    終わり

    def self.included(レシーバー)
      receiver.extend ClassMethods
      receiver.send :include、InstanceMethods
    終わり
  終わり
終わり

次に、クラス「ActiveMerchant::Shipping::UPS」をロードする必要があります。その後、メソッドをクラスにアタッチできます。

Rails.configuration.to_prepare do
  require_dependency [[ActiveMerchant::Shipping::UPSのファイル]]
  'patch_classes' が必要です)
  ActiveMerchant::Shipping::UPS.send(:include, ::ActiveMerchantExpand::Shipping)
終わり

これは Rails プラグインの作成によるものです。これが役立つことを願っています。

よろしくtingel2k

于 2013-04-04T08:39:09.187 に答える
1

requireモンキーパッチを明示的にファイルしていますか? 必要とせずにアプリまたはライブラリパスの下に置くだけでは、定数ActiveMerchant::Shipping::UPSがgemで定義されており、依存関係解決メカニズムをトリガーしないため、ロードされません。

于 2012-08-23T15:42:30.417 に答える