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

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

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

我最近发现的一件事是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。

于 2011-08-07T23:12:59.820 回答
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'在文件顶部有一个。

我们可以查看带来此更改的提交(这个是从 2011 年 1 月 19 日开始的)。提交消息说:

修复了在非 Rails 环境中使用 AS 时导致问题的缺失要求

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

于 2011-08-13T06:34:30.537 回答