【问题标题】:Excess spaces wile rendering multiline string in Rails 5在 Rails 5 中渲染多行字符串时多余的空格
【发布时间】:2016-02-16 09:18:51
【问题描述】:

我最终遇到了奇怪的错误(功能?):

test.html.erb 文件如下所示:

<textarea><%= "a\nb\nc" %></textarea>

在渲染的文本区域中,我期望类似的东西:

a
b
c

但我得到了:

这些多余的空间是从哪里来的?

Rails 5.0.0.beta2

UDP:我应该在前面提到它,但是在 form_for 块内使用 f.text_area 时我遇到了同样的问题。它看起来像:

.form
  =form_for article do |f|
    .form-group
      =field_label f, :text, true
      =f.text_area :text, class: %w(form-control), rows: 20, placeholder: t('placeholder.article_text')

(HAML)

我最终得到了它,只是将漏洞利用简化为带有一个字符串的简单 erb 文件

UDP2: simple_format 的外观如下:&lt;textarea&gt;&lt;%= simple_format("a\nb\nc") %&gt;&lt;/textarea&gt;

我应该澄清一些事情:这个文本区域用于编辑文章文本。然后它(文本)将在出现在 html 页面之前使用降价处理器(RDiscount)进行处理。我不知道,为什么我应该使用 simple_format 在 textarea 中显示原始文本以及为什么这样 应该变成这个 保存后?

【问题讨论】:

  • 为什么不使用 html br&lt;textarea&gt;&lt;%= "a&lt;br&gt;b&lt;br&gt;c" %&gt;&lt;/textarea&gt; ?
  • @Зелёный 因为我实际上使用了 f.text_area 助手,它产生了同样的问题

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:

在 HAML 中,使用

~ f.text_area :text 

而不是

= f.text_area :text

~ 运算符抑制 HAML 中的“漂亮”换行符,这对 TEXTAREA 和 PRE 标记很有用。请参阅Whitespace preservation in HAML 了解更多信息。

【讨论】:

    【解决方案2】:
    <textarea><%= "a\r\nb\r\nc" %></textarea>
    

    \n 是新行,它将在与上一行相同的位置移至下一行 \r 是回车,表示移动到行首。

    但我不会推荐这种方法你应该使用&lt;br/&gt;标签来代替

    所以用

     <textarea><%= WhatEverTheTextIs.gsub(/\n/, '<br/>').html_safe %></textarea>
    

    这会将所有换行符替换为&lt;br&gt;标签

    一个更简单的解决方案是使用simple_format i-e:

     <textarea><%= simple_format(YOUR_TEXT_HERE) %></textarea>
    

    更新

    这是用于表单助手的代码

    .form
      =form_for article do |f|
        .form-group
          =field_label f, :text, true
          =f.text_area :text,:value=>simple_format(article.text), class: %w(form-control), rows: 20, placeholder: t('placeholder.article_text')
    

    【讨论】:

    • 其实在form_for helper里面使用f.text_area helper也会出现同样的问题,这是一个普遍的问题
    • 是的,是一样的。您可以在 f.text_area 中使用上述任何技术,例如 f.text_area :description , :value=> simple_format(YOUR_TEXT_HEAR)
    • 不,它完全按照它应该的方式工作 :) 但是现在
      标记之前出现空格,请参阅 UDP2
    【解决方案3】:

    我刚刚遇到了完全相同的问题。这一切都归结为模板和布局中的空白。在我的情况下,我的主应用程序正在使用 HAML,并且有一个 application.html.haml,其中包含类似这样的部分

        #content.container{tabindex: "-1"}
          .row
            - if content_for?(:left_nav)
              .col-md-3.sidebar
                = yield(:left_nav)
              .col-md-9
                = flash_helper
                = yield
    
                %footer
                  = render :partial => 'shared/footer'
    

    在主要内容的“yield”之前至少有 10 个空格。

    然后我使用来自 ERB 中的 gem 的视图,而不是 HAML。但是,由于我的主要应用程序布局是 HAML,因此视图渲染/处理通过 HAML 渲染器进行。 HAML 已经处理了空格和 texareas,但是当最终和完整的视图被渲染时,主布局中的所有额外空格都包含在 html 中,并导致 textarea 的内容缩进。

    为什么第一行不缩进?因为 HAML“保留”功能会清除文本区域中第一行的空白。见https://github.com/haml/haml/issues/516

    对我来说,简单的解决方法是将 HAML 配置为使用“丑陋”模式。这在渲染视图时消除了所有前导空格。 HAML FAQ 中的 textareas 中有更多关于“丑陋”模式和换行符的信息。将 HAML 配置为使用丑陋模式:

    为了提高性能,Haml 在生产中运行的 Rails 应用程序中默认使用 {Haml::Options#ugly "ugly" 模式}。丑陋的模式是去掉空格,这偶尔会导致问题。

    如果您使用的是 Rails,您可以通过创建 config/initializers/haml.rb 文件并添加以下行来更改默认行为。

    Haml::Template.options[:ugly] = true

    我在研究时发现有用的链接:

    我的版本是 Rails 4.2.6 和 HAML 4.0.7

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 2022-10-04
      • 2013-06-03
      相关资源
      最近更新 更多