0

ruby のオープンクラスのエラーを理解するのに苦労しています。テスト環境 (レール) でメソッドをオーバーライドすると、初期化時に無効な引数エラーが発生します。何らかの理由で、新しいメソッドをオーバーライドすると問題が解決しました。なんで?

私のクラス:

require 'adwords_api'
require 'adwords_config'
require 'scanf'

class AdwordsHelper
  attr_accessor :adwords_id
  attr_accessor :campaign_id
  attr_accessor :adgroup_id
  attr_accessor :invalid_ops

  @@RETRY_INTERVAL = 3
  @@RETRIES_COUNT = 500
  @@config = 'adwords_api.yml'

  def initialize(args = {})
    self.adwords_id = AdwordsConfig.config[:master_account]

    return unless args.is_a?(Hash)
    args.each do |k,v|
      instance_variable_set("@#{k}", v) unless v.nil?
    end
  end

  def set_budget(budget)
    @api = get_adwords_api
    budget_id = get_budget_id

    service = @api.service(:BudgetService)
    operation = {
      :operator => 'SET',
      :operand => {
        :budget_id => budget_id,
        :amount => {
          :micro_amount => budget
        }
      }
    }

    service.mutate([operation])
  end
end

テストでは、実際のアドワーズ サーバーと通信したくないので、メソッドの 1 つをオーバーライドします。

require "test_helper"
# FIXME override this in another file eventually
class AdwordsHelper
  def set_budget(budget)
    true
  end
end

通話中

AdwordsHelper.new(campaign_id: 1)

0 エラーに対して無効な引数 1 を与えます。

ここで、新しい関数をオーバーライドすると、エラーが解決されます。

class AdwordsHelper
  def self.new(*args, &block)
    obj = allocate
    obj
  end
  def set_budget(budget)
    true
  end
end

メソッド set_budget をオーバーライドすると、他の癖が発生しますか?

4

1 に答える 1

0

試す

AdwordHelper.class_eval do
  def set_budget(budget)
    true
  end
end

class AdwordHelperは、元の AdwordHelper がまだ読み込まれていない場合にクラスを定義します。この場合、クラスに存在する唯一のメソッドは set_budget です。引数が 1 つの初期化についてはわかりません。

一方、class_eval を使用すると、AdwordHelper クラスを含むファイルを読み込んでから、メソッド set_budget をクラスに追加しようとします。

于 2013-09-23T03:07:49.417 に答える