Rails 3:如何正确显示来自“textarea”的文本?
在我的Rails 3应用程序中,我使用textarea
让用户在论坛中写入新消息。
但是,当显示消息时,所有换行看起来像空格(没有<br />
)。 也许还有其他的不匹配的例子,我还不知道。
我想知道处理这个问题最合适的方法是什么。
我想,存储在数据库中的文本是好的(例如,我看到<
转换为<
),所以主要的问题是演示文稿。
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