带有折线的文本在 Rails 中不起作用

Posted

技术标签:

【中文标题】带有折线的文本在 Rails 中不起作用【英文标题】:Text with break lines not working in Rails 【发布时间】:2020-05-06 12:31:22 【问题描述】:

我有一个 AngularJs + Rails。

我有一个带有文本字段的表单,用户可以在其中编写带有换行符的任何文本。当用户提交表单时,消息存储在数据库中并通过电子邮件发送给另一个用户。发送的电子邮件应保留换行符。

关键是消息的格式在生产中完美运行。但是,它已停止开发工作。显然,我们还没有对影响这一点的代码进行特定的更新,但我们正在将 Rails 和 mysql 迁移到开发中的更新版本。所以,我想知道它是否与此有关,但是,我无法看到问题到底出在哪里。

请用一个例子来看看这两种不同的行为:

我们将在两个环境中发送相同的示例消息,所以在我们的 textarea 中我们写:

This is a test message

with a some break lines.

Lorem ipsum whatever.

这是发送来存储在我的 mysql 数据库中的 varchar 字段中的文本消息: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

很遗憾,由于调试级别未设置为调试,我无法在生产中看到此详细日志。

当我在 webmail 中打开测试用户在 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 网络邮件中的外观:

生产工作正常:

<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>

这是它在生产中的样子:

可能根本不相关,购买我的 rails 版本是:

开发:Rails 5.2.4、mysql 8.0.18

生产:Rails 4.4.0,mysql Ver 14.14 Distrib 5.5.40,用于使用 readline 6.3 的 debian-linux-gnu (x86_64)

【问题讨论】:

TLDR 但我想我已经掌握了问题的要点。尝试阅读这些String 类方法:to_jsonas_json。还有一件事:如果您将字符串保存在&lt;pre&gt; 标签(like "&lt;pre&gt;This is my string&lt;/ pre&gt;")中的rails 中,它会保留所有html,这也可能适用于您的情况,或者必须有类似的解决方案。 您的
 方法不起作用。我得到了相同的结果,但只是使用了不同的字体系列样式。关于to_json,我不知道你想去哪里。如果您认为这是解决方案,请提供更多详细信息。
@Rober 正如你所说,你正在迁移系统(MySql,Rail)你的意思是你的生产是旧版本并且你已经开始迁移开发了吗? 正确!刚刚注意到写帖子的时候漏掉了mysql的开发资料。但是您可以在帖子底部找到两个环境版本的详细信息。 【参考方案1】:

这很可能解释了额外的垂直间距:

Windows 使用 CR LF 换行。

Unix 系统使用 LF。

Macintosh 使用 CR。

当您在需要另一种形式的系统上显示一种形式的换行符时,可能会出现混乱。

也许“正确”的设计仅使用 LF,然后根据目标机器的需要进行更改或扩展。请注意,&lt;br&gt; 等同于 HTML,其中 CR 和 LF 只是“空白”。

另请参阅 &lt;pre&gt;phpNL2BR() 以及可能的其他内容。

【讨论】:

【参考方案2】:

您使用什么模板引擎来生成电子邮件并进行 CSS 内联?

我怀疑这与这里的问题有关,因为您给出的示例中用于开发和生产的 style 输出不同。

特别是,开发有white-space: pre-wrap,生产有white-space: pre-line。这很重要,因为pre-line 会将多个换行符压缩为一个换行符,而pre-wrap 将保留所有换行符。


这有望解释为什么您在生产和开发中看到不同的行为,但您可能希望保留用户键入的所有空格。在这种情况下,您可以通过替换实例 \r\r\n 来确保一致的间距只需\n

例如user_input.gsub(/\r\n?/, "\n")

【讨论】:

感谢您的帮助。我很想说你找到了。您在开发和生产中看到的不同空白样式只是测试时的一个小错误,但不幸的是,当您尝试不同的选项 pre-wrap 或 pre-line 时没有任何反应。 关于第二条评论,如果你仔细阅读描述,你会发现我正在发送这个文本:这是一条测试消息\n\n带有一些断行。\n\nLorem ipsum不管数据库。所以,我只是按照你的建议使用 \n 。我在开发和生产中都发送电子邮件,并在 Mac 的同一台笔记本电脑上打开它。因此,唯一的区别是在 Mac 下运行 dvevelopent 和在 Ubuntu 下运行生产的服务器。那么,我会在服务器中指向解析消息吗?

以上是关于带有折线的文本在 Rails 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有引导程序 3.3.4 的字形图标在 rails 4.2.1 中不起作用

图形文本标签在折线图中不起作用 python

Rails / Redcarpet:Markdown->带有链接属性的HTML在帮助器中不起作用

html_safe 在 rails 的 link_to 标题属性中不起作用

Select2 占位符在带有 hidden_​​field 的 Rails 应用程序中不起作用

带有has_many的模型中的属性总和:通过关联在Rails 5中不起作用