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 />
)。也许还有其他不匹配的例子,我还不知道。
我想知道处理这个问题的最合适的方法是什么。
我猜存储在数据库中的文本是可以的(例如我看到&lt;
被转换为&lt;
),所以主要问题是演示文稿。
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
不符合您的要求,我将创建一个简单的辅助方法将换行符转换为<br>
s:
def nl2br(s)
s.gsub(/\n/, '<br>')
end
那么在你看来你可以这样使用它:
<%= nl2br(h(@forum_post.message)) %>
【讨论】:
在 Rails 3 中,h
方法默认是不需要的。
是的,但在这种情况下你需要它,因为如果你不使用它,br 也会被转义。像这样,只有消息被转义,而不是 br 的。
您应该使用 Rails 的内置 simple_format()
方法,而不是自己滚动。简单地将其添加到您的视图中:<%=simple_format h @forum_post.message %>
@Mischa,啊,他们不希望 <p>
标签包装结果。我仍然觉得这是他们应该处理的标记问题。无论如何,我的错。
是的,这真的很有帮助:)【参考方案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 替代
另一种方法是将文本包装在<pre>
标签中。我的 CSS 选项的最后一点在这里也是正确的:
<p>
<pre><%= your.text %></pre>
</p>
不要使用空格或换行符将您的文本与 <pre>
标记分开。
最后的想法
在谷歌上搜索了一下这个问题后,我觉得 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 内容保存到 mysql 然后在页面上正确显示