Активный продавец - неинициализированная константа ActiveSupport :: XmlMini_REXML :: StringIO

Имею 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(). Есть идеи, что не так с моей настройкой? Спасибо.


person harsha    schedule 01.08.2011    source источник
comment
Чтобы решить эту проблему, можно поместить require "stringio" в начало кода, но в этом нет необходимости.   -  person Andrew Grimm    schedule 02.08.2011
comment
Привет, большое спасибо за ответ. У меня это сработало, но почему это происходит? и есть ли еще какое-нибудь хорошее решение? Это какая-то проблема с версией драгоценного камня, которую я использую? Кто-нибудь еще сталкивается с этой проблемой?   -  person harsha    schedule 04.08.2011
comment
Я не знаю. Я добавлю тег ruby ​​on rails к этому вопросу и посмотрю, у кого-нибудь это получится.   -  person Andrew Grimm    schedule 05.08.2011
comment
По-прежнему нет ответа! Посмотрим, есть ли больше интереса, теперь за это назначена награда.   -  person Andrew Grimm    schedule 08.08.2011


Ответы (2)


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

person Andrew Grimm    schedule 07.08.2011

Эндрю Гримм в значительной степени попал в точку своим оригинальным комментарием по этому вопросу. Отсутствующий require 'stringio' действительно является проблемой. Но это ошибка Rails, а точнее ActiveSupport 3.0.9 (откуда, похоже, и исходит ошибка). Мы можем отследить это с помощью истории коммитов рельсов git.

Сначала нам нужно проверить рельсы и переключиться на тег 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 в среде без рельсов

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

person skorks    schedule 13.08.2011
comment
Следует ли переносить это исправление с 3.1.x на 3.0.x? Аарон Тендерлав Паттерсон сказал на RubyKaigi 2011, что бэкпорты иногда забываются, потому что никто не несет ответственности за конкретную ветку. - person Andrew Grimm; 13.08.2011
comment
Как вы говорите, его следует перенести в ветку 3.0.x. Я бы сказал, что об этом просто забыли или никто не думал об этом. - person skorks; 13.08.2011