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

Posted

技术标签:

【中文标题】Rails 3:如何正确显示“textarea”中的文本?【英文标题】:Rails 3: How to display properly text from "textarea"? 【发布时间】:2011-08-16 16:18:51 【问题描述】:

在我的 Rails 3 应用程序中,我使用 textarea 让用户在论坛中写新消息。

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

我想知道处理这个问题的最合适的方法是什么。

我猜存储在数据库中的文本是可以的(例如我看到<被转换为<),所以主要问题是演示文稿。

Rails 中有内置的辅助方法吗?

(simple_format 做了一些看起来与我需要的类似的事情,但它添加了我不想出现的 <p> 标签。)

【问题讨论】:

【参考方案1】:

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>"

【讨论】:

不完全是,这会在文本中保留 HTML。 这对我来说是完美的答案。【参考方案2】:

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

【讨论】:

这是迄今为止最好的答案,因为它保留了代码逻辑。代码显示问题?然后改变显示,而不是数据! 我同意这是最好的答案。此外,您可能想使用 white-space: pre-line,因为 pre-wrap 缩进行开头【参考方案3】:

由于simple_format 不符合您的要求,我将创建一个简单的辅助方法将换行符转换为&lt;br&gt;s:

def nl2br(s)
  s.gsub(/\n/, '<br>')
end

那么在你看来你可以这样使用它:

<%= nl2br(h(@forum_post.message)) %>

【讨论】:

在 Rails 3 中,h 方法默认是不需要的。 是的,但在这种情况下你需要它,因为如果你不使用它,br 也会被转义。像这样,只有消息被转义,而不是 br 的。 您应该使用 Rails 的内置 simple_format() 方法,而不是自己滚动。简单地将其添加到您的视图中:&lt;%=simple_format h @forum_post.message %&gt; @Mischa,啊,他们不希望 &lt;p&gt; 标签包装结果。我仍然觉得这是他们应该处理的标记问题。无论如何,我的错。 是的,这真的很有帮助:)【参考方案4】:

如果有人仍然被重定向到这里并使用 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>"

【讨论】:

【参考方案5】:

仅 CSS 选项

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

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

在大多数情况下,您应该选择pre-line 而不是pre-wrap。查看区别here。

请务必牢记white-space,您不应该这样做:

<p style="white-space: pre-line;">
  <%= your.text %>
</p>

它会在输出中产生额外的空格和换行符。取而代之的是:

<p style="white-space: pre-line;"><%= your.text %></p>

HTML 替代

另一种方法是将文本包装在&lt;pre&gt; 标签中。我的 CSS 选项的最后一点在这里也是正确的:

<p>
  <pre><%= your.text %></pre>
</p>

不要使用空格或换行符将您的文本与 &lt;pre&gt; 标记分开。

最后的想法

在谷歌上搜索了一下这个问题后,我觉得 html-approach 被认为不如 css 干净,我们应该使用 css-way。但是,html-way 似乎更兼容浏览器(支持过时的浏览器,但谁在乎):

pre tag

white-space

【讨论】:

【参考方案6】:

以下帮助程序将新行保留为换行符,并将任何 HTML 或脚本(例如 Javscript)呈现为纯文本。

def with_new_lines(string)
   (h(string).gsub(/\n/, '<br/>')).html_safe
end

在视图中按原样使用

<%= with_new_lines @object.some_text %>

【讨论】:

【参考方案7】:

我刚刚使用了white-space: pre-line。所以下一行 (\n) 将渲染它。

【讨论】:

【参考方案8】:

您需要将 textarea 的纯文本转换为 HTML。

在最基本的层面上,您可以运行字符串替换:

 message_content.gsub! /\n/, '<br />'

您还可以使用特殊格式,例如 Markdown(Ruby 库:BlueCloth)或 Textile(Ruby 库:RedCloth)。

【讨论】:

【参考方案9】:

我在我的 Rails 应用程序中使用 Ace 代码编辑器,但我遇到了问题,每当我更新或创建代码时,它总是在每一行添加额外的 TAB(第一行除外)。我无法用 gsub 或 javascript replace 解决它。但是当我禁用该模板的布局时,它意外地自行解决了。

所以,我用

解决了
render :layout => false

【讨论】:

以上是关于Rails 3:如何正确显示“textarea”中的文本?的主要内容,如果未能解决你的问题,请参考以下文章

textarea的换行符处理以及正确的在Html中显示

正确显示textarea中输入的回车和空格

字形在 Ubuntu Rails 4.1 安装中未正确显示

将 textarea 内容保存到 mysql 然后在页面上正确显示

如何在 Rails 中正确使用 params.require

逐步存储textarea mysql php