【问题标题】:Active Merchant - uninitialized constant ActiveSupport::XmlMini_REXML::StringIOActive Merchant - 未初始化的常量 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 标记添加到这个问题中,看看是否有其他人解决它。
  • 还是没有反应!让我们看看现在有赏金是否有更多的兴趣。

标签: ruby-on-rails ruby activemerchant activesupport


【解决方案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 分支中。我会说它只是被遗忘了,或者没有人愿意这样做。
    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 2011-07-30
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多