Active Merchant - 未初始化的常量ActiveSupport :: XmlMini_REXML :: StringIO

时间:2011-08-01 10:06:38

标签: ruby-on-rails ruby activemerchant activesupport

我有1.16.0的activemerchant和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()调用传播。 知道我的设置有什么问题吗? 感谢。

2 个答案:

答案 0 :(得分:1)

根据问题,当代码本身时它不起作用,但在添加require "stringio"时起作用。

我怀疑ActiveMerchant是经过单元测试的,但由于某些原因,这些单元测试未检测到对StringIO的依赖,可能是因为该单元的其他部分间接测试代码require的字符串。

我最近发现的一件事是require 'yaml'为你提供了stringio库作为副作用:

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

并且不难想象ActiveMerchant(或Rails的其他部分)的单元测试需要yaml。

然而,这只是猜测。我没有检查过,因为我没有使用Rails。

答案 1 :(得分:1)

安德鲁·格里姆(Andrew Grimm)对这个问题的原始评论几乎让人头疼。缺少的require 'stringio'确实是个问题。但它是Rails的一个错误,更具体地说是ActiveSupport 3.0.9(错误似乎来自哪里)。我们可以使用rails的git commit history跟踪它。

首先我们需要检查rails并切换到v3.0.9标签。如果我们现在查看activesupport/lib/active_support/xml_mini/rexml.rb,我们会看到require 'stringio'不存在。这本身并不重要,但请耐心等待。我们现在可以切换到下一个标签(v3.0.10.rc1),我们将看到该文件尚未更新(这个版本的rails很可能会出现同样的问题)。行中的下一个标记是v3.1.0.beta1,请注意,这次文件顶部有一个require 'stringio'

我们可以查看带来此更改的提交(this one here,自2011年1月19日起)。提交消息说:

  

修复了在a中使用AS时导致故障的缺失需求   non-rails env

这表明只要你处于铁轨环境中,这个问题就不会浮出水面。所以,我的猜测是关于环境导致问题出现的问题,可能与OP表示他们正在使用rails 3.0.5 的事实有关,但错误来自activesupport - 的 3.0.9 即可。也许代码是从一个忘记继承:environment的rake任务调用的(没有更多信息很难说)。无论哪种方式,将require 'stringio'放在代码的顶部肯定是修复,直到你可以升级到Rails 3.1(一旦它出来),此时将不再需要require。