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

时间:2011-05-02 00:09:56

标签: ruby-on-rails ruby-on-rails-3 textarea newline

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

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

我想知道最合适的方法是什么。

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

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

simple_format做了类似于我需要的内容,但它添加了<p>个我不想出现的标签。)

9 个答案:

答案 0 :(得分: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>"

答案 1 :(得分:34)

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

答案 2 :(得分:28)

由于simple_format没有达到你想要的效果,我会制作一个简单的辅助方法,将换行符转换为<br> s:

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

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

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

答案 3 :(得分: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>"

答案 4 :(得分:8)

仅CSS选项

我认为最简单的选择之一是使用css select (string_to_array(a::text, ','))[3] as pid from pg_stat_activity a;

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

在大多数情况下,您应该选择white-space: pre-line;而不是pre-line。查看差异here

请注意pre-wrap你不应该做这样的事情,这一点非常重要:

white-space

它会在输出中产生额外的空格和换行符。相反,请遵循:

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

HTML替代

另一种方法是将文本包装在<p style="white-space: pre-line;"><%= your.text %></p> 标签中。关于我的CSS选项的最后一点注意事项也是如此:

<pre>

请勿使用空格或换行符将文本与<p> <pre><%= your.text %></pre> </p> 标记分开。

最后的想法

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

pre tag

white-space

答案 5 :(得分:3)

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

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

在视图中使用

<%= with_new_lines @object.some_text %>

答案 6 :(得分:3)

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

答案 7 :(得分:2)

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

在最基本的级别,您可以运行字符串替换:

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

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

答案 8 :(得分:0)

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

所以,我用

解决了这个问题
render :layout => false