Rails -- 在文本区域中添加换行符

69

我有一个Rails应用程序,可以在我的模型中输入几段文本。问题是,我不知道如何输入任何换行符。

我尝试添加“{ln} {/ ln}; {&nbsp}和 {br} {/ br}”,但它只显示html代码,而没有换行符。

有没有办法设置文本区域控件将使用我放置在模型条目中的html?

有没有什么东西我可以输入,让Rails识别,嘿,在这里加一行?


它在哪里没有正确地呈现?在实际文本区域内,当您返回编辑值时(即<%= f.text_area :description %>)?还是在页面上,当您明确呈现值时(即<%= obj.description %>)? - Ian Lesperance
在我尝试呈现数据的页面上,它只是将< br >作为文本放置。 - ChrisWesAllen
11个回答

112

7
为了避免 XSS 攻击,您应该像这样转义变量:<%= simple_format h(my_text_field) %>。其中,simple_format 和 h 函数可以使文本格式化并进行 HTML 转义处理。 - tomeduarte
7
@tomeduarte的simple_format默认进行了格式化,不需要使用h()。这是一篇旧文章...也许这个功能是新的。 - tybro0103
1
@tybro0103 这是Rails 3特有的功能,引入自https://github.com/rails/rails/commit/84d387bc0f3f3f6641b08d0ce40e924f09105c19 - 2010/06/17; 我可能不知道或者假设它在Rails 2.x中不存在(记不清了)。感谢您为以下读者提供信息! :) - tomeduarte
5
simple_format存在的问题在于其过于巧妙。它可以保存文本中的任何\n符号,但是会假设两个\n符号表示一个新段落,并且将输入的内容包裹在<p>标签内。使用哪种方法取决于你的具体需求。如果你必须完全保留所有换行符,则应该使用被接受的答案。否则,使用simple_format,并计划在输出此值时添加段落标记。 - Aaron

88

问题不在于编辑值,而在于稍后呈现它。要在文本区域中编辑值并添加换行符,请按回车键。以后重新编辑该值时,空格应仍然存在。

呈现空格是棘手的部分。在HTML中,空格通常不重要。像浏览器使用的渲染器将为任何连续的空格字符串显示一个空格。因此,仅仅将值转储到页面上是不够的:

<%= obj.description %>

即使您的值可能是"One \t \n \n Two",它在屏幕上显示为"One Two"
要使这些换行符在显示时实际分隔行,请在呈现之前将它们转换为HTML:
<%= obj.description.gsub(/\n/, '<br/>') %>

当然,如果用户输入的数据将被包含在您的HTML中,您应该转义这些值以防XSS攻击。如果您只需要支持换行符,则应该像这样简单:
<%= h(obj.description).gsub(/\n/, '<br/>') %>

如果您想允许更复杂的格式,请查看MarkdownTextile(Rails都提供了助手视图方法)。请确保调查它们是否提供对XSS防护的支持。

44
从Rails 3开始,您需要添加 .html_safe: <%= h (obj.description). gsub (/ \n /,'<br/>')。html_safe %> - tybro0103

33

保持用户输入不变,并将以下内容添加到您的CSS中:

white-space: pre-line;

当用户输入\r或\n(回车符或换行符)时,它将作为新行显示。


4
非常容易。很好的答案。 - Dennis Best
5
这应该是答案。 - Onichan
simple_format 在 Mailer 视图中似乎只能保留一个换行符,即使你有多个。这个答案可行。 - Abdullah Aden
1
哇,真不敢相信这个一直存在了这么多年。而且它被每个浏览器都支持! - installero

10

这是另一种在保留其余文本的转义的同时显示字符串中换行的方法:

<%= safe_join(@object.textarea_input.split("\r\n"), "<br />".html_safe) %>

我喜欢它并添加了自己定制的东西。 - Taimoor Changaiz
2
你也可以使用 tag 助手,像这样:safe_join(@object.textarea_input.split("\r\n"), tag(:br)) - amoebe

1

simple_format 的问题在于它还会添加其他标签,比如 <b><i><hr><h1> 等等...
如果你只想要换行而不带其他标签,我建议你构建一个局部文件(我们称之为 line_break):

<% text.split("\n").each do |t| %>
  <%= t %><br>
<% end %>

然后,只需从您的视图中调用它:

<%= render partial: 'line_break', locals: {text: some_text} %>

1
你使用的Rails版本是什么?因为处理方式在Rails 2和3中不同。
假设记录的值为"foo<br />bar" 在Rails 3中,如果要评估HTML,可以这样做:<%=raw "foo<br />bar" %>,如果这样做,您将在视图中看到一个换行符。
在Rails 2中,您不必这样做,只需执行<%= "foo<br />bar" %> 而且,在文本区域中HTML代码也无法被评估。


0
其他答案都是错误的。文本区域不会将
渲染为换行符,因为 TEXTAREA 元素的 innerHTML 值不会渲染 HTML。
你需要添加换行符 HTML 实体:&#10; 例如:
<textarea><%= "LINE 1&#10;LINE 2&#10;LINE 3".html_safe %></textarea>

另请参阅文本区域中的新行 - Stack Overflow


0

上面的回答都很好:

  • gsub(@Ian)效果很好
  • simple_format(@Karl)有点过头了,正如@Aaron指出的那样,将所有内容都包裹在<p>

所以我进行了以下调整:

simple_format(value, {}, wrapper_tag: 'div')

0

\n 如果我的记忆没错的话(今天它表现不太好...尝试需谨慎哈哈)

编辑:假设你在谈论一个 textarea,如果只是简单输出,那么就使用 <br>


我尝试过使用换行符以及在括号内使用相同的方法,但它仍然只是将代码输出为文本。 - ChrisWesAllen
你能提供你正在使用的代码吗?这样我们就可以更好地了解我们在看什么,而不是胡乱猜测。 - mynameiscoffey
没问题...视图中有以下代码:<p> <%= f.label :description %><br /> <%= f.text_area :description %> </p> 就是这样。我只是想在文本区域内关闭HTML。 - ChrisWesAllen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接