Rails – 在文本区域添加换行符

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

我试着添加“{ln} {/ ln}; {&nbsp}和{br} {/ br}”,但只显示html文本并且没有中断。

有没有反正我可以设置它,所以文本区域控件将使用任何我在模型条目中放置的html?

有什么我可以input的,所以铁轨会认出,嘿在这里放了一条线?

问题不在于编辑它的价值,因为它在稍后渲染。 要在textarea中编辑新值时添加换行符,只需按回车键即可。 稍后再重新编辑该值时,空白符仍然应该在那里。

渲染空白是棘手的部分。 在HTML中,空白通常是微不足道的。 像浏览器使用的渲染器将为任何连续的空白string显示一个空格。 所以仅仅把价值倾销到页面上是不够的:

 <%= obj.description %> 

即使您的价值可能是"One \t \n \n Two" ,它会在屏幕上显示为"One Two"

为了让这些新的行字符在显示时真正将行分开,您需要在呈现之前将它们转换为HTML:

 <%= obj.description.gsub(/\n/, '<br/>') %> 

当然,如果用户正在input将包含在HTML中的数据,则应该避开值来防止XSS 。 如果新线是你需要支持的唯一的东西,它应该像这样简单:

 <%= h(obj.description).gsub(/\n/, '<br/>') %> 

如果你想允许更复杂的格式,看看Markdown和Textile (这两个Rails提供了辅助视图方法)。 只要确定调查是否提供了XSS预防的支持。

textareas中的换行符产生为\ n。 但是,问题是,如果您只是将其转储到您的视图,它将只是在HTML源代码中的换行符。

你可以尝试使用Rails的simple_format帮助器来为你处理这个问题: http : simple_format

它会自动将换行符转换为HTML标签。 你可以像<%= simple_format(my_text_field) %>一样使用它。

保持用户input未修改,并添加到您的CSS:

 white-space: pre-line; 

它将在用户input中显示\ r或\ n(input)作为新行。

这是另一种在string中显示换行符的方法,同时仍然逃脱文本的其余部分:

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

simple_format的问题是,它也添加了其他标签,如<b><i><hr><h1>
如果你只是想换行没有其他标签,我build议你build立一个部分(让我们叫line_break):

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

那么,只需从您的视图中调用它:

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

你使用什么版本的导轨? 因为处理这个的方法在第二和第三轨道中是不同的。

假设logging的值是"foo<br />bar"

在rails 3中,如果你想评估html,你可以执行<%=raw "foo<br />bar" %> ,如果你这样做的话,你会看到一个换行符。

在rails 2中,你不需要这么做,只需要执行<%= "foo<br />bar" %>

而且,HTML不会在textarea中被评估。

\n如果记忆服务(它今天没有做得很好…尝试在你自己的风险大声笑)

编辑:假设你正在谈论一个textarea ,如果它是简单的输出,只需使用<br>

如果你只是在视图中显示你的string。 然后尝试一下

 < p >This is my text< / p >< br /> 

上面的答案是好的:

  • gsub (@Ian)运行良好
  • @Aaron指出, simple_format (@Karl)稍微超出了顶层,将所有内容包装在<p>

所以我调整如下:

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