Active Merchant - неинициализированная константа ActiveSupport :: XmlMini_REXML :: StringIO - PullRequest
4 голосов
/ 01 августа 2011

У меня activemerchant 1.16.0 и рельсы 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(). Есть идеи, что не так с моей настройкой? Благодаря.

Ответы [ 2 ]

1 голос
/ 13 августа 2011

Эндрю Гримм в значительной степени ударил по гвоздю по голове своим оригинальным комментарием по этому вопросу. Отсутствие require 'stringio' действительно является проблемой. Но это ошибка в Rails, точнее ActiveSupport 3.0.9 (откуда, похоже, и возникает ошибка). Мы можем отследить это, используя git commit history of 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'.

Мы можем проверить коммит, который привел к этому изменению ( этот здесь от 19 января 2011). Сообщение коммита говорит:

исправлено отсутствующее требование, которое вызывает проблемы при использовании AS в не рельсы env

Это указывает на то, что, пока вы находитесь в рельсовой среде, эта проблема не возникнет. Итак, я предполагаю, что что-то из-за среды вызвало возникновение проблемы, может быть связано с тем, что OP говорит, что они используют rails 3.0.5 , но ошибка исходит от activesupport- 3.0.9 . Возможно, код был вызван из задачи граблей, которую забыли наследовать от :environment (трудно сказать без дополнительной информации). В любом случае, размещение require 'stringio' в верхней части кода, безусловно, является исправлением, пока вы не сможете перейти на Rails 3.1 (как только он выйдет), и в этом случае требование больше не потребуется.

1 голос
/ 08 августа 2011

В соответствии с вопросом, он не работает, когда код сам по себе, но работает, когда добавляется 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...