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

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

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

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

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

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

( simple_format做的东西看起来类似于我所需要的,但它增加了我不想出现的<p>标签。)

由于simple_format没有做你想做的 ,我会做一个简单的辅助方法将换行符转换为<br> s:

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

然后在你看来,你可以像这样使用它:

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

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

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

如果有人仍然在这里redirect,并使用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>" 

仅限CSS的选项

我相信最简单的select之一是使用CSS white-space: pre-line;

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

在大多数情况下,你可能应该selectpre-line pre-wrap 。 在这里查看区别。

记住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方法比css更清洁,我们应该去css-way。 但是,html方式似乎更多的浏览器兼容(支持古老的浏览器,但谁在乎):

预标签

空白

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

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

在视图中使用

 <%= with_new_lines @object.some_text %> 

我只是用了white-space: pre-line 。 所以下一行(\ n)将会呈现它。

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

在最基本的层面上,你可以运行一个stringreplace:

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

你也可以使用像Markdown (Ruby库: BlueCloth )或Textile (Ruby库: RedCloth )这样的特殊格式。

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

所以,我解决了它

 render :layout => false