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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案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
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-10-21
                • 1970-01-01
                • 1970-01-01
                • 2020-08-26
                • 1970-01-01
                • 2022-10-16
                • 1970-01-01
                相关资源
                最近更新 更多