带有折线的文本在 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_json
、as_json
。还有一件事:如果您将字符串保存在<pre>
标签(like "<pre>This is my string</ pre>"
)中的rails 中,它会保留所有html,这也可能适用于您的情况,或者必须有类似的解决方案。
您的 方法不起作用。我得到了相同的结果,但只是使用了不同的字体系列样式。关于to_json,我不知道你想去哪里。如果您认为这是解决方案,请提供更多详细信息。@Rober 正如你所说,你正在迁移系统(MySql,Rail)你的意思是你的生产是旧版本并且你已经开始迁移开发了吗? 正确!刚刚注意到写帖子的时候漏掉了mysql的开发资料。但是您可以在帖子底部找到两个环境版本的详细信息。 【参考方案1】:
这很可能解释了额外的垂直间距:
Windows 使用 CR LF 换行。
Unix 系统使用 LF。
Macintosh 使用 CR。
当您在需要另一种形式的系统上显示一种形式的换行符时,可能会出现混乱。
也许“正确”的设计仅使用 LF,然后根据目标机器的需要进行更改或扩展。请注意,<br>
等同于 HTML,其中 CR 和 LF 只是“空白”。
另请参阅 <pre>
和 php 的 NL2BR()
以及可能的其他内容。
【讨论】:
【参考方案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 中不起作用
Rails / Redcarpet:Markdown->带有链接属性的HTML在帮助器中不起作用
html_safe 在 rails 的 link_to 标题属性中不起作用