使用<code>和<pre>时,Textarea在Sinatra / Datamapper提交的表单上添加额外的空格

问题描述

|| 因此,我正在使用Sinatra和Datamapper为我的投资组合网站(http://erickel.ly)制作自己的CMS /博客。一切顺利,直到我写了第一篇实际文章,并且需要显示一些代码。我的第一个猜测是,当我将源代码粘贴到用于输入每个帖子内容的文本区域中时,仅将源代码代码和pre标签一起包装起来。它工作正常,但第一行之后的每一行都以大量不属于的多余空格开头。 这是帖子类:
class Post
  include DataMapper::Resource

  property :id,Serial
  property :title,String
  property :slug,String
  property :body,Text
  property :created_at,DateTime
  property :updated_at,DateTime  
end
这是帖子内容表单的文本区域:
%label(for=\"body\") Body:
%textarea(name=\"body\" rows=\"10\" cols=\"40\")
  = @post.body
这是我要输入的文本区域:
<code>
<pre>class Link
  include DataMapper::Resource

  property :long_url,String,:length =&gt; 1024,:format =&gt; :url
  property :short_url,:key =&gt; true
  property :created_at,DateTime

  def self.gen_short_url
    # Create an Array of possible characters
    chars = (\'a\'..\'z\').to_a + (\'A\'..\'Z\').to_a + (\'0\'..\'9\').to_a
    tmp = chars[rand(62)] + chars[rand(62)] + chars[rand(62)]

    while Link.get(tmp)
      puts \"Tried \" + tmp
      tmp = chars[rand(62)] + chars[rand(62)] + chars[rand(62)]
      puts \"tmp is Now \" + tmp
    end

    tmp
  end
end</pre>
</code>
提交表单后,将保存文本区域中的数据,但要保留额外的空格。当我返回到编辑页面时,该页面显示帖子的“ body”的当前值,显示如下:
<code>
                  <pre>class Link
                    include DataMapper::Resource

                    property :long_url,:length => 1024,:format => :url
                    property :short_url,:key => true
                    property :created_at,DateTime

                    def self.gen_short_url
                      # Create an Array of possible characters
                      chars = (\'a\'..\'z\').to_a + (\'A\'..\'Z\').to_a + (\'0\'..\'9\').to_a
                      tmp = chars[rand(62)] + chars[rand(62)] + chars[rand(62)]

                      while Link.get(tmp)
                        puts \"Tried \" + tmp
                        tmp = chars[rand(62)] + chars[rand(62)] + chars[rand(62)]
                        puts \"tmp is Now \" + tmp
                      end

                      tmp
                    end
                  end</pre>
                  </code>
如果我再次提交带有该值的表单,则会在每行的开头添加更多的空格。我不确定如何避免这种情况,但这确实使我失望。任何帮助,将不胜感激! -埃里克     

解决方法

        在阅读创建Compass的人的这篇博客文章时,我遇到了自己问题的答案。 http://chriseppstein.github.com/blog/2010/02/08/haml-sucks-for-content/ 该问题必须归因于HAML在将换行符添加到文档之前尝试保留换行符的方式。有关HAMl处理空白的方式的更多信息,请访问http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#whitespace_preservation 我解决问题的方法是关闭HAML使HTML变得漂亮的尝试,根据Chris Eppstein的说法,这也将使HAML渲染速度提高两倍。我通过将以下内容添加到我的主要ruby文件中来做到这一点:
set :haml,{ :ugly => true }
我还没有注意到任何负面因素。     ,        代替写作
%textarea(name=\"body\" rows=\"10\" cols=\"40\")
    = @post.body
删除换行符,然后像这样重写:
%textarea(name=\"body\" rows=\"10\" cols=\"40\")= @post.body
仅此而已,您无需执行其他任何操作。我遇到了类似的问题,花了一个多小时使它生效。