【问题标题】:Rails -- Add a line break into a text areaRails -- 在文本区域中添加换行符
【发布时间】:2011-03-09 10:05:12
【问题描述】:

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

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

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

有什么我可以输入的东西让 rails 可以识别吗,嘿,在这里写一行?

【问题讨论】:

  • 哪里渲染不正确?当您返回编辑值(即<%= f.text_area :description %>)时,在实际的文本区域内?或者在页面上当您明确呈现值时(即<%= obj.description %>)?
  • 在我试图呈现数据的页面上,它只是将
    作为文本放置

标签: html ruby-on-rails textarea


【解决方案1】:

文本区域中的换行符生成为 `\n'。但是,问题在于,如果您只是将其转储到您的视图中,它将只是您的 HTML 源代码中的换行符。

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

它会自动将换行符转换为 HTML 标签。您可以将其与<%= simple_format(my_text_field) %> 之类的内容一起使用。

【讨论】:

  • 作为记录,为了避免 XSS 攻击,您应该像这样转义 var:
  • @tomeduarte simple_format 默认情况下会进行清理,不需要 h() 。这是一篇旧帖子......也许这个功能是新的。
  • @tybro0103 它是特定于 Rails 3 的,在 github.com/rails/rails/commit/… - 2010/06/17 中引入;要么我不知道,要么假设是 rails 2.x(不记得了)。感谢以下读者的提及! :)
  • simple_format 的问题在于它太聪明了。它会保留文本中的任何 \n,但它会假定两个 \n 表示一个新段落,并将接受您的输入并将其特定部分包装在 <p> 标签中。这实际上取决于您的需求是您应该使用哪种方法。如果您绝对必须保留所有新行,则应使用已接受的答案。否则,请使用 simple_format 并计划要输出此值的段落标签。
【解决方案2】:

问题与其说是编辑值,不如说是稍后渲染它。要在文本区域中编辑值时添加换行符,只需按回车键。当您稍后重新编辑该值时,空格应该仍然存在。

渲染空白是棘手的部分。在 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 预防提供的任何支持。

【讨论】:

  • 从 Rails 3 开始,您必须添加 .html_safe:').html_safe %>
【解决方案3】:

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

white-space: pre-line;

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

【讨论】:

  • 简单多了。很好的答案。
  • 这应该是答案。
  • simple_format 似乎只保留 1 个换行符,即使在 Mailer 视图中使用时您有多个换行符。这个答案有效1
  • 哇,不敢相信这些年来这里一直存在。每个浏览器都支持它!
【解决方案4】:

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

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

【讨论】:

  • 我喜欢并在其中添加了我自己定制的东西
  • 你也可以使用tag helper,像这样:safe_join(@object.textarea_input.split("\r\n"), tag(:br))
【解决方案5】:

【讨论】:

    【解决方案6】:

    simple_format 的问题在于它还添加了其他标签,例如 &lt;b&gt;&lt;i&gt;&lt;hr&gt;&lt;h1&gt;...
    如果你只想要没有其他标签的换行符,我建议你构建一个部分(我们称之为 line_break):

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

    那么,从你的角度来调用它:

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

    【讨论】:

      【解决方案7】:

      您使用的是什么版本的导轨?因为处理这个问题的方式在 rails 2 和 rails 3 是不同的。

      假设记录的值为"foo&lt;br /&gt;bar"

      在rails 3中,如果你想评估html,你可以&lt;%=raw "foo&lt;br /&gt;bar" %&gt;,如果你这样做,当你看到视图时你会得到一个换行符。

      在 Rails 2 中,您不必这样做,只需 &lt;%= "foo&lt;br /&gt;bar" %&gt;

      此外,HTML 无论如何都不会在文本区域中进行评估。

      【讨论】:

        【解决方案8】:

        \n 如果没记错的话(今天的表现不太好......风险自负)

        编辑:假设您在谈论textarea,如果它是简单的输出,只需使用&lt;br&gt;

        【讨论】:

        • 不,我尝试了 \n 以及括号内的相同内容,但它仍然只是输出代码,就好像它是文本一样
        • 您能否提供您正在使用的代码,以便我们更好地了解我们正在查看的内容,而不是随机猜测?
        • 当然...视图有


          差不多它。我只是想关闭文本区域内的html
        【解决方案9】:

        上面的答案很好:

        • gsub (@Ian) 运行良好
        • simple_format (@Karl) 有点像@Aaron 指出的那样,将所有内容都包含在&lt;p&gt;

        所以我做了如下调整:

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

        【讨论】:

          【解决方案10】:

          其他答案是错误的。文本区域不会将
          呈现为换行符,因为 TEXTAREA 元素的 innerHTML 值不会呈现 HTML..

          您需要添加换行 HTML 实体:&amp;#10;

          示例:

          <textarea><%= "LINE 1&#10;LINE 2&#10;LINE 3".html_safe %></textarea>
          

          另见New line in text area - Stack Overflow

          【讨论】:

            【解决方案11】:

            如果您只是在视图中显示您的字符串。然后用

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

            【讨论】:

              猜你喜欢
              • 2010-09-09
              • 2014-03-31
              • 2010-10-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-04-08
              • 2023-03-14
              相关资源
              最近更新 更多