Текст с разрывными строками не работает в Rails - PullRequest
4 голосов
/ 20 января 2020

У меня есть AngularJs + Rails.

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

Дело в том, что формат сообщения отлично работает в производстве. Однако он перестал работать в разработке. По-видимому, мы не сделали конкретного обновления c в коде, который влияет на это, но мы переносим наши Rails и mysql на более новую версию в данный момент в разработке. Итак, мне интересно, связано ли это с этим, однако, я не могу увидеть, где именно проблема.

Пожалуйста, рассмотрим два различных поведения с примером:

Мы отправим один и тот же пример сообщения в обоих средах, поэтому в нашей текстовой области мы пишем:

This is a test message

with a some break lines.

Lorem ipsum whatever.

Это текстовое сообщение, которое отправляется для хранения в поле varchar в моей базе данных mysql: This is a test message\n\nwith a some break lines.\n\nLorem ipsum whatever.

Этот текст, который я вижу, хранится как в базе данных разработки, так и в рабочей базе данных: This is a test message with a some break lines. Lorem ipsum whatever.

Это шаблон для отправки электронного письма как в процессе разработки, так и в производстве (без изменений): <p class="p1" style="white-space: pre-wrap;"><%= @offer.message_pre_offer %></p>

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

<p class=3D"p1" style=3D"white-space: pre-wrap; margin: 1em 0; padding: 0=
; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; color: #606=
060; font-family: Source Sans Pro, Helvetica Neue, Helvetica, Arial, sans=
-serif; font-size: 15px; line-height: 150%; font-weight: 300;" align=3D"l=
eft">This is a test message=0D
=0D
with a some break lines.=0D
=0D
Lorem ipsum whatever.</p>=0D
<style>=0D

К сожалению, я не вижу этот подробный журнал в рабочей среде, потому что уровень отладки не настроен на отладку.

Когда я открываю сообщение о том, что тестовый пользователь попадает в gmail в веб-почте Вот код, который я вижу в инструментах разработчика в Chrome:

Разработка работает неправильно:

<p style="white-space:pre-wrap;margin:1em 0;padding:0;color:#606060;font-family:Source Sans Pro,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:15px;line-height:150%;font-weight:300" align="left">This is a test message



with a some break lines.



Lorem ipsum whatever.</p>

Вот как это выглядит в веб-почте gmail: enter image description here

Производство работ королевский штраф:

<p style="color:#606060;font-family:Source Sans Pro,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:15px;font-weight:300;line-height:150%;margin:1em 0;padding:0;text-align:left;white-space: pre-line;" align="left">This is a test message

with a some break lines.

Lorem ipsum whatever.</p>

Вот так это выглядит в производстве: enter image description here

Вероятно, это вообще не связано, купите мои версии рельсов:

  • Разработка: Rails 5.2.4, mysql 8.0.18

  • Производство: Rails 4.4.0, mysql Версия 14.14 Distrib 5.5.40, для debian- linux -gnu (x86_64) с использованием readline 6.3

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Какой движок шаблонов вы используете для генерации электронных писем и для встраивания CSS?

Я подозреваю, что это связано с проблемой здесь, потому что вывод style для разработки и производства отличается примеры, которые вы привели.

В частности, разработка имеет white-space: pre-wrap, а производство - white-space: pre-line. Это важно, потому что pre-line сведет несколько символов новой строки в одну новую строку, тогда как pre-wrap сохранит их все. но вы, вероятно, захотите сохранить все пробелы, которые вводит пользователь. В этом случае вы можете обеспечить постоянный интервал, заменив экземпляры \r и \r\n просто \n

, например, user_input.gsub(/\r\n?/, "\n")

0 голосов
/ 23 января 2020

Это, вероятно, объясняет дополнительный вертикальный интервал:

Windows использует CR LF для разрывов строк.

Unix системы используют LF.

Macinto sh использует CR.

Когда вы отображаете одну форму разрыва строки в системе, которая ожидает другую форму, может возникнуть беспорядок.

Возможно, «правильный» дизайн использует только LF, затем изменяется или расширяется по мере необходимости в зависимости от целевой машины. Обратите внимание, что <br> является эквивалентом HTML, где CR и LF являются просто "пробелами".

См. Также <pre> и PHP s NL2BR() и, возможно, другие вещи.

...