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

Chr*_*len 63 html textarea ruby-on-rails

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

我尝试添加"{ln} {/ ln}; { }和{br} {/ br}",但这只会将html显示为文本而不会中断.

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

有什么东西我可以输入,所以rails会识别,嘿,在这里放一条线?

Kar*_*arl 107

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

您可以尝试使用Rails simple_format帮助程序来处理其中的一些问题:http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#M002285

它会自动将换行符转换为HTML标记.你可以使用类似的东西<%= simple_format(my_text_field) %>.

  • 为了记录,为了避免XSS攻击你应该像这样转义var:<%= simple_format h(my_text_field)%> (6认同)
  • @tomeduarte simple_format默认清理,不需要h().这是一个老帖子......也许这个功能是新的. (6认同)
  • simple_format的问题在于它太聪明了.它将保留你文本中的任何\n,但它会假设两个\n是用来表示一个新的段落,并将接受你的输入并将它的特定部分包装在`<p>`标签中.这实际上取决于您需要使用哪种方法.如果_absolutely_必须保留所有新行,则应使用接受的答案.否则,请使用simple_format并计划要输出此值的段落标记. (5认同)

Ian*_*nce 84

问题不在于编辑值,而是在稍后渲染它.要在textarea中编辑换行符时在其值中添加换行符,只需按返回键即可.当您稍后重新编辑该值时,空格应该仍然存在.

渲染空白是一个棘手的部分.在HTML中,空格通常是微不足道的.像浏览器使用的渲染器将为任何连续的空格字符串显示单个空格.所以仅仅将值转储到页面上是不够的:

<%= obj.description %>
Run Code Online (Sandbox Code Playgroud)

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

要使这些新行字符在显示时实际分隔行,您需要在呈现之前将它们转换为HTML:

<%= obj.description.gsub(/\n/, '<br/>') %>
Run Code Online (Sandbox Code Playgroud)

当然,如果用户输入将包含在HTML中的数据,则应该转义值以防止XSS.如果您需要支持新行,那么它应该像这样简单:

<%= h(obj.description).gsub(/\n/, '<br/>') %>
Run Code Online (Sandbox Code Playgroud)

如果你想允许更复杂的格式化,请查看MarkdownTextile(这两个Rails都提供了帮助视图方法).请务必调查他们为XSS预防提供的支持.

  • 从Rails 3开始,你必须添加.html_safe:<%= h(obj.description).gsub(/ \n /,'<br />').html_safe%> (42认同)

ber*_*ika 21

保持用户输入不变,并将其添加到您的CSS:

white-space: pre-line;
Run Code Online (Sandbox Code Playgroud)

它将在用户输入中显示\ r或\n(输入)作为新行.

  • 这么容易多了.好答案. (2认同)
  • 这应该是答案. (2认同)

小智 8

这是另一种在字符串中显示换行符的方法,同时仍然可以转义文本的其余部分:

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

  • 您也可以使用 `tag` 助手,如下所示:`safe_join(@object.textarea_input.split("\r\n"), tag(:br))` (2认同)