文本区域在使用<code>和<pre>时使用 Sinatra/Datamapper 在表单提交时添加额外的空格



所以我正在使用Sinatra和Datamapper为我的投资组合网站制作我自己的CMS/Blog(http://erickel.ly)。一切都很顺利,直到我去写我的第一篇实际帖子,我需要显示一些代码。我的第一个猜测是,当我把souce代码粘贴到用于输入每个帖子内容的文本区域时,只需要用代码和预标记来包装它。它运行良好,但第一行开始后的每一行都有大量不属于它的额外空间。

这是后类:

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,  String, :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>

在我们提交表单后,文本区域中的数据会被保存,但会有额外的空间。当我回到编辑页面,显示帖子"正文"的当前值时,显示的是:

<code>
                  <pre>class Link
                    include DataMapper::Resource
                    property :long_url,   String, :length => 1024, :format => :url
                    property :short_url,  String, :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>

如果我再次提交包含该值的表单,则会在每行的开头添加更多的额外空格。我不知道如何防止这种情况发生,但这真的让我很失望。如果有任何帮助,我将不胜感激!

-Eric

在阅读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

仅此而已,你不需要做任何其他事情。我也有类似的问题,花了一个多小时才解决。

最新更新