Есть ли способ избежать ошибки кодирования при использовании ActionMailer с Ruby 1.8.7 - PullRequest
0 голосов
/ 30 июня 2011

Я получаю следующую ошибку при отправке простого электронного письма через ActionMailer в Rails:

NoMethodError: undefined method `encode!' for "Hello":String

Это срабатывает всякий раз, когда выполняется следующее:

def hello_world_email()

   mail( :from => "me",
      :to => "you,
      :subject => "Hello World"
       )
end

Из этого исследования видно, что это вызвано различиями между Ruby 1.8.7 и 1.9. *, Который имеет встроенную поддержку кодировки символов.

Есть ли способ заставить ActionMailer работать с Ruby 1.8.7 и избежать этой проблемы? (Я могу обновить Ruby на своей машине, но я не могу сделать то же самое для всех остальных, работающих над проектом). Учитывая, что весь Rails 3.0.9 (частью которого является ActionMailer) предназначен для работы с Ruby 1.8.7, я продолжаю думать, что должен быть способ ...

Примечание. Моя точная версия Ruby - ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0] (предварительно установлена ​​в OSX).

Ответы [ 3 ]

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

У вас могут быть проблемы с использованием Ruby 1.8 и наличием постоянной кодировки, определенной гемом. Например, мы обнаружили проблему с классом, включающим REXML в глобальной области видимости.

Строка, о которой идет речь в библиотеке, была:

value.encode!(charset) if defined?(Encoding) && charset

Это проверка глобальной константы, называемой Кодировка. (Который может быть определен в любом геме в глобальной области видимости.) На самом деле нашей проблемой было включение, которое затем сделало REXML :: Encoding доступным везде как Encoding. Вы можете попытаться найти или кодировать вашу кодовую базу для "кодировки модуля" или "кодировки класса".

Надеюсь, это поможет.

Трассировка стека ниже определяет проблему.

NoMethodError: undefined method `encode!' for "Generate":String
mail (2.2.19) lib/mail/fields/unstructured_field.rb:169:in `encode'
mail (2.2.19) lib/mail/fields/unstructured_field.rb:138:in `fold'
mail (2.2.19) lib/mail/fields/unstructured_field.rb:108:in `wrapped_value'
mail (2.2.19) lib/mail/fields/unstructured_field.rb:70:in `do_encode'
mail (2.2.19) lib/mail/fields/unstructured_field.rb:52:in `encoded'
mail (2.2.19) lib/mail/field.rb:123:in `send'
mail (2.2.19) lib/mail/field.rb:123:in `method_missing'
mail (2.2.19) lib/mail/header.rb:190:in `encoded'
mail (2.2.19) lib/mail/header.rb:189:in `each'
mail (2.2.19) lib/mail/header.rb:189:in `encoded'
mail (2.2.19) lib/mail/message.rb:1708:in `encoded'
actionmailer (3.0.10) lib/action_mailer/base.rb:445:in `set_payload_for_mail'
actionmailer (3.0.10) lib/action_mailer/base.rb:425:in `deliver_mail'
activesupport (3.0.10) lib/active_support/notifications.rb:52:in `instrument'
activesupport (3.0.10) lib/active_support/notifications/instrumenter.rb:21:in `instrument'
activesupport (3.0.10) lib/active_support/notifications.rb:52:in `instrument'
actionmailer (3.0.10) lib/action_mailer/base.rb:424:in `deliver_mail'
mail (2.2.19) lib/mail/message.rb:230:in `deliver'
0 голосов
/ 25 апреля 2012

У меня была такая же ошибка, когда я пытался проверить мои письма с подтверждением разработки.Странно было то, что выполнение изолированного теста не выкинуло это исключение.Запуск всего стека сделал.После выполнения бинарного поиска я обнаружил, что одна из моих спецификаций использовала REXML для анализа некоторого содержимого.

    require 'spec_helper'
    require 'rexml/document'
    include REXML
    doc = Document.new(response.body)

Я не знаю, почему я включил REXML, предположительно, потому что я хотел сохранить REXML:: перед документом.Но изменение кода на это решило проблему:

    require 'spec_helper'
    require 'rexml/document'
    doc = REXML::Document.new(response.body)

, если вам случится использовать где-то такой код, это может исправить это кодирование!проблема с рубином 1.8.7

0 голосов
/ 04 июля 2011

Я обнаружил, что проблема связана с самоцветом почтовой программы, и я решил исправить его на 2.2.13.

...