在纯文本电子邮件中使用\ n处理字符串

时间:2013-03-29 23:45:22

标签: ruby-on-rails-3 email line-breaks plaintext

我的数据库中有一个包含如下字符串的列:

"Warning set for 7 days.\nCritical Notice - Last Time Machine backup was 118 days ago at 2012-11-16 20:40:52\nLast Time Machine Destination was FreeAgent GoFlex Drive\n\nDefined Destinations:\nDestination Name: FreeAgent GoFlex Drive\nBackup Path: Not Specified\nLatest Backup: 2012-11-17"

我正在通过电子邮件向用户显示此数据。通过执行以下操作,我能够轻松地在html电子邮件中格式化该字段:

simple_format(@servicedata.service_exit_details.gsub('\n', '<br>'))

以上代码将"\n"替换为"<br>"标记,simple_format处理其余标记。

我的问题出现在如何在纯文本模板中正确格式化。最初我以为我可以调用该列,因为它有"\n"我认为纯文本会解释,一切都会很好。但是,如上所示,这只是简单地将“\ n”完整的字符串吐出,而不是根据需要创建换行符。

尝试找到一种解析字符串的方法,以便确认换行符。我试过了:

    @servicedata.service_exit_details.gsub('\n', '"\r\n"')
    @servicedata.service_exit_details.gsub('\n', '\r\n')
    raw @servicedata.service_exit_details
    markdown(@servicedata.service_exit_details, autolinks: false) # with all the necessary markdown setup
    simple_format(@servicedata.service_exit_details.html_safe)

没有一个奏效。

任何人都可以告诉我我做错了什么或我如何做到这一点?

我想要的是纯文本确认换行符并格式化字符串,如下所示:

Warning set for 7 days.
Critical Notice - Last Time Machine backup was 118 days ago at 2012-11-16 20:40:52
Last Time Machine Destination was FreeAgent GoFlex Drive

Defined Destinations:
Destination Name: FreeAgent GoFlex Drive
Backup Path: Not Specified\nLatest Backup: 2012-11-17"

1 个答案:

答案 0 :(得分:1)

我明白了。

您需要区分文字反斜杠后跟字母n作为两个字符的序列,以及一个LF字符(a.k.a。换行符),通常表示为\n

你还需要区分你在Ruby中使用的两种不同的引用:单打和双打。单引号是文字的:唯一用单引号解释的是序列\',以逃避单引号,以及序列\\,它产生一个反斜杠。因此,'\n'是反斜杠和字母n的双字符字符串。

双引号允许包含各种奇怪的东西:你可以使用#{}插值,你可以通过转义序列插入特殊字符:所以"\n"是一个包含LF控制字符的字符串

现在,在您的数据库中,您似乎拥有前者(反斜杠和n),正如两个证据所示:您在打印时看到字面反斜杠和n这一事实它,以及gsub找到'\n'的事实。你需要做的是用实际的行分隔符字符替换无用的反斜杠 - 和 - n

@servicedata.service_exit_details.gsub('\n', "\r\n")