4

私はactivemerchant 1.16.0とrails 3.0.5を持っています。

アクティブなマーチャントを使用して PayPal のゲートウェイと通信するための基本的なコードを作成しようとしています。

if credit_card.valid?
  # or gateway.purchase to do both authorize and capture
  response = gateway.authorize(1000, credit_card, :ip => "127.0.0.1")
  if response.success?
    gateway.capture(1000, response.authorization)
    puts "Purchase complete!"
  else
    puts "Error: #{response.message}"
  end
else
  puts "Error: credit card is not valid. #{credit_card.errors.full_messages.join('. ')}"
end

次のエラーが表示されます。

/Library/Ruby/Gems/1.8/gems/activesupport-3.0.9/lib/active_support/xml_mini/rexml.rb:20:in `parse': uninitialized constant ActiveSupport::XmlMini_REXML::StringIO (NameError)

このエラーはgateway.authorize()呼び出しから伝播します。私のセットアップの何が問題なのですか?ありがとう。

4

2 に答える 2

1

Andrew Grimmは、この質問に対する彼の元のコメントで頭に釘を打ちました。行方不明require 'stringio'は確かに問題です。ただし、これはRails、より具体的にはActiveSupport 3.0.9(エラーの原因と思われる場所)のバグです。railsのgitcommit履歴を使用して追跡できます。

まず、レールをチェックアウトして、v3.0.9タグに切り替える必要があります。今見てみると、activesupport/lib/active_support/xml_mini/rexml.rbそれrequire 'stringio'はありません。それ自体は重要ではありませんが、我慢してください。これで次のタグ(v3.0.10.rc1)に切り替えることができ、ファイルが更新されていないことがわかります(このバージョンのレールでも同じ問題が発生する可能性があります)。次のタグはv3.1.0.beta1で、今回require 'stringio'はファイルの先頭にがあります。

この変更をもたらしたコミットを確認できます(これは2011年1月19日からのものです)。コミットメッセージには次のように書かれています。

Rails以外の環境でASを使用するときに問題を引き起こす欠落しているrequireを修正しました

これは、Rails環境にいる限り、この問題が表面化しないことを示しています。だから、私の推測では、問題が発生した環境についての何かであり、OPがレール3.0.5を使用していると言っているという事実と関係があるかもしれませんが、エラーはactivesupport- 3.0.9から来ています。おそらく、コードは継承を忘れたrakeタスクから呼び出されました:environment(詳細情報なしで言うのは難しいです)。require 'stringio'いずれにせよ、Rails 3.1にアップグレードできるようになるまで(リリースされたら)、コードの先頭に置くことは間違いなく修正です。その時点で、requireは不要になります。

于 2011-08-13T06:34:30.537 に答える
1

質問によると、コードが単独の場合は機能しませんが、require "stringio"追加すると機能します。

私の疑いでは、ActiveMerchant は単体テストされていますが、何らかの理由で StringIO への依存関係がこれらの単体テストで検出されません。おそらく、単体テスト コードの他の部分が間接的にrequirestringio を使用しているためです。

私が最近発見したことの 1 つはrequire 'yaml'、副作用として stringio ライブラリを提供することでした。

StringIO.new
# NameError: uninitialized constant StringIO
#   from (irb):1
require "yaml"
# => true
StringIO.new
# => #<StringIO:0x7fb7d48ce360>
RUBY_VERSION
# => "1.8.7"

yaml を必要とする ActiveMerchant (または Rails の他の部分) の単体テストを想像するのは難しくありません。

ただし、これは憶測にすぎません。Railsは使っていないので確認していません。

于 2011-08-07T23:12:59.820 に答える