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 的依赖,可能是因为单元测试代码的其他部分间接require
s 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 订阅信息?