Rails 3 - Heroku - Двоичные проблемы с типом данных - Работает локально не на Heroku, предложения по отладке? - PullRequest
1 голос
/ 13 декабря 2010

У меня есть приложение rails 3 на heroku.

У меня есть таблица в приложении, где я храню входящие электронные письма.Я добавил столбец MESSAGE с двоичным типом данных.Это закончилось тем, что работало очень хорошо локально.

Затем я подтолкнул к героку, и он сломался.Когда я проверяю heroku, он говорит, что тип данных действительно двоичный, но, глядя на рельсы логов, вставляется сообщение (mail) в виде строки, а не двоичной, и я не могу сказать, что имею представление, почему.предложения здесь?Любые идеи о том, как лучше всего отладить эту проблему?

ОШИБКА:

ActiveRecord::StatementInvalid (PGError: ERROR:  invalid byte sequence for encoding "UTF8": 0xbb
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".

Спасибо за любые идеи

Ответы [ 2 ]

1 голос
/ 13 декабря 2010

Таким образом, дело с cloudmailin заключается в том, что он частично формулирует сообщение для вас на своих серверах, а затем использует запрос POST для предоставления вам данных, как говорится в их документации

Сообщение не отправлено в виде файла. Вместо этого пользователь как будто вставил содержимое сообщения в текстовое поле.

Это означает, что если вы явно не конвертируете сообщение в двоичные рельсы, оно будет обрабатываться как строка. Один из способов сделать это может - преобразовать сообщение в объект Mail, используя гем Mail. Документация на сайте cloudmailins содержит пример.

РЕДАКТИРОВАТЬ: Хорошо, я думаю, что я неправильно понял, что здесь происходит. Предполагая, что по какой-либо причине вы хотите сохранить исходное письмо в базе данных, вам необходимо его кодировать, чтобы БД не выдавала ошибку кодирования UTF8. Для этого преобразуйте данные, которые вы получаете из cloudmailin, в объект Mail через Mail.new, затем возьмите полученный вами почтовый объект, который мы вызовем @m и вызовем @em = @m.encoded. @em теперь содержит экодированную версию электронной почты, которую вы сможете хранить без проблем. При чтении электронного письма из базы данных просто конвертируйте его обратно, передав кодированный текст в Mail.new(@em).

Дайте мне знать, если это работает.

Источник: http://docs.cloudmailin.com/post_format

0 голосов
/ 12 января 2011

В дополнение к тому, что некоторые другие парни сказали, что есть несколько причин, по которым это может происходить.

Во-первых, содержимое сообщения, которое вы пытаетесь сохранить, неправильно выделено как UTF-8.Все параметры, которые мы отправляем из CloudMailin, должны быть в формате UTF-8, в этом случае force_encoding ('utf-8') - ваш друг.Если вам известен исходный формат, вы также можете использовать .encode ('utf-8')

Другой случай - это то, что заголовки письма или сам контент искажены.Мы видели это пару раз, особенно с темой и заголовками.Обычно они должны быть закодированы, но во многих случаях почтовый клиент не делает этого, что означает, что нет способа обнаружить используемую кодировку и надежно ее преобразовать.

Не стесняйтесь обращаться к нам в CloudMailin, если выПо-прежнему возникают проблемы, так как гораздо проще понять, в чем проблема, по самой необработанной электронной почте.

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