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