Rails 3:如何正确显示"textarea"中的文本?

Mis*_*hko 37 textarea newline ruby-on-rails ruby-on-rails-3

在我的Rails 3应用程序中,我用它textarea来让用户在论坛中写一条新消息.

但是,当显示消息时,所有换行符看起来都像空格(没有<br />).也许还有其他不匹配的例子,我还不知道.

我想知道解决这个问题最合适的方法是什么.

我想存储在数据库中的文本是正常的(我看到例如<转换为&lt;),因此主要问题是演示文稿.

Rails中是否有内置辅助方法?

(simple_format做了类似于我需要的东西,但它添加了<p>我不想出现的标签.)

Mic*_*per 73

Rails有一个开箱即用的帮助方法,所以你不必编写自己的方法.

从文档:

simple_format(text, html_options={}, options={})

my_text = "Here is some basic text...\n...with a line break."

simple_format(my_text)
# => "<p>Here is some basic text...\n<br />...with a line break.</p>"

more_text = "We want to put a paragraph...\n\n...right there."

simple_format(more_text)
# => "<p>We want to put a paragraph...</p>\n\n<p>...right there.</p>"

simple_format("Look ma! A class!", :class => 'description')
# => "<p class='description'>Look ma! A class!</p>"
Run Code Online (Sandbox Code Playgroud)

  • 不完全是,这会在文本中保留HTML. (2认同)

efa*_*tsi 34

您可以style="white-space: pre-wrap;"在文本周围的html标记中使用.这尊重文本中的任何换行符.

  • 我同意这是最好的答案.此外,您可能希望使用white-space:pre-line,因为预包装缩进行开头 (5认同)
  • 这是迄今为止最好的答案,因为它保留了代码逻辑.编码显示问题?然后改变显示,而不是数据! (4认同)

Mis*_*cha 28

既然simple_format没有做你想要的,我会做一个简单的帮助方法来将换行转换为<br>s:

def nl2br(s)
  s.gsub(/\n/, '<br>')
end
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中,您可以像这样使用它:

<%= nl2br(h(@forum_post.message)) %>
Run Code Online (Sandbox Code Playgroud)

  • 你应该使用Rails的内置`simple_format()`方法,而不是自己滚动.简单地将此添加到您的视图中:`<%= simple_format h @ forum_post.message%>` (14认同)
  • 是的,但在这种情况下你需要它,因为如果你不使用它,br也将被转义.像这样,只有消息被转义而不是br. (2认同)

Ayo*_*nix 8

如果有人仍然在这里重定向并使用Rails 4:http: //apidock.com/rails/v4.0.2/ActionView/Helpers/TextHelper/simple_format

您现在可以指定它包含的标记(默认为p),如下所示:

simple_format(my_text, {}, wrapper_tag: "div")
# => "<div>Here is some basic text...\n<br />...with a line break.</div>"
Run Code Online (Sandbox Code Playgroud)


miz*_*nix 8

仅CSS选项

我相信最简单的选择之一就是使用css white-space: pre-line;

其他答案也提到了使用空格,但我认为它需要更多的信息:

在大多数情况下,您应该选择pre-line结束pre-wrap.在这里查看差异.

记住white-space你不应该做这样的事情是非常重要的:

<p style="white-space: pre-line;">
  <%= your.text %>
</p>
Run Code Online (Sandbox Code Playgroud)

它会在输出中产生额外的空格和换行符.相反,请使用此:

<p style="white-space: pre-line;"><%= your.text %></p>
Run Code Online (Sandbox Code Playgroud)

HTML替代方案

另一种方法是将文本包装在<pre>标签中.关于我的CSS选项的最后一点注意事项也是如此:

<p>
  <pre><%= your.text %></pre>
</p>
Run Code Online (Sandbox Code Playgroud)

不要将文本与<pre>带有空格或换行符的标记分开.

最后的想法

谷歌搜索这个问题之后我觉得html-approach被认为不如css那么干净,我们应该去css-way.然而,html-way似乎更兼容浏览器(支持古老的浏览器,但谁在乎):

预标签

空白