所以我正在使用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 => 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>
在我们提交表单后,文本区域中的数据会被保存,但会有额外的空间。当我回到编辑页面,显示帖子"正文"的当前值时,显示的是:
<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
仅此而已,你不需要做任何其他事情。我也有类似的问题,花了一个多小时才解决。