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

Posted

技术标签:

【中文标题】Active Merchant - 未初始化的常量 ActiveSupport::XmlMini_REXML::StringIO【英文标题】:Active Merchant - uninitialized constant ActiveSupport::XmlMini_REXML::StringIO 【发布时间】:2011-10-17 08:01:51 【问题描述】:

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

【问题讨论】:

一种变通方法可能是将require "stringio" 放在代码的顶部,但您不需要这样做。 嘿,非常感谢您的回答。这对我有用,但为什么会这样?还有其他好的解决方法吗?这是我使用的 gem 版本的问题吗?还有其他人面临这个问题吗? 我不知道。我会将 ruby​​ on rails 标记添加到这个问题中,看看是否有其他人解决它。 还是没有反应!让我们看看现在有赏金是否有更多的兴趣。 【参考方案1】:

根据问题,单独使用代码时不起作用,但添加require "stringio"时起作用。

我怀疑 ActiveMerchant 已经过单元测试,但由于某种原因,这些单元测试没有检测到对 StringIO 的依赖,可能是因为单元测试代码的其他部分间接requires 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。

【讨论】:

【参考方案2】:

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 日起)。提交消息说:

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

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

【讨论】:

是否应该将此修复从 3.1.x 向后移植到 3.0.x? Aaron “tenderlove” Patterson 在 RubyKaigi 2011 上表示,有时会忘记反向移植,因为没有人负责特定的分支。 如你所说,它应该被反向移植到 3.0.x 分支中。我会说它只是被遗忘了,或者没有人愿意这样做。

以上是关于Active Merchant - 未初始化的常量 ActiveSupport::XmlMini_REXML::StringIO的主要内容,如果未能解决你的问题,请参考以下文章

配置 active_merchant 以与 Rails 3 应用程序兼容

我们可以使用 active-merchant authorized.net COM API 从网关检索交易详情吗?

在 Active Merchant / PayPal Express Checkout 中设置税额

使用 Active Merchant 从 Authorize.net 获取 ARB 订阅信息?

Active Merchant 和 Authorize.net 在生产中返回失败

使用 Active Merchant 和 PayPal 时出现 SSL 错误