常见问题解答
Haml
如何在一个元素后面添加标点符号,例如“我喜歡 <strong>蛋糕</strong>!
”?
表达文档结构和表达内联格式是两个截然不同的问题。Haml 主要用于结构,因此处理格式的最佳方法是将其留给其他为此设计的语言。您可以使用 Textile
%p
:textile
I like *cake*!
或 Markdown
%p
:markdown
I like **cake**!
或普通的 XHTML
%p I like <strong>cake</strong>!
如果您插入的是由助手生成的元素,例如链接,那么就更简单了
%p== I like #{link_to 'chocolate', 'http://franschocolates.com'}!
如何阻止 Haml 缩进 pre
和 textarea
标签的内容?
由于 Haml 会自动缩进 HTML 源代码,因此像 pre
和 textarea
这样的对空白敏感的标签的内容可能会被搞乱。解决方法是将这些标签内的换行符替换为 HTML 换行符实体 (

),Haml 使用 Haml::Helpers#preserve 和 Haml::Helpers#find_and_preserve 助手来实现。
通常,Haml 会在您使用需要它的标签时自动执行此操作(可以使用 :preserve
选项自定义)。例如,
%p
%textarea= "Foo\nBar"
将被编译为
<p>
<textarea>
Foo
Bar</textarea>
</p>
但是,如果助手生成了标签,Haml 就无法检测到这一点,因此您必须自己调用 Haml::Helpers#find_and_preserve。您也可以使用 ~
,它与 =
相同,只是它会自动在其输入上运行 find_and_preserve
。例如
%p= find_and_preserve "<textarea>Foo\nBar</textarea>"
与
%p~ "<textarea>Foo\nBar</textarea>"
相同,并呈现
<p><textarea>Foo
Bar</textarea></p>
如何在 Haml 文档中使我的长行 Ruby 代码看起来更漂亮?
将它们放在助手或模型中。
Haml 故意让在模板中放置大量 Ruby 代码变得很麻烦,因为很多代码不属于视图。如果您将那个巨大的 link_to_remote
调用移动到 update_sidebar_link
助手,它将使您的视图更易于阅读且更具语义。
如果您绝对必须在模板中放置大量代码,Haml 提供了一个有点笨拙的多行延续工具。在您要合并为一行(包括最后一行!)的每一行末尾放置一个 |
(管道字符)。例如
%p= @this.is(way.too.much). |
code("and I should"). |
really_move.it.into( |
:a => @helper) |
请注意,有时在模板中包含大量 Ruby 是有效的,当该 Ruby 是一个助手调用,它传递了大量模板信息时。因此,当一个函数有很多参数时,可以将其跨多行包装,只要每一行都以逗号结尾。例如
= link_to_remote "Add to cart",
:url => { :action => "add", :id => product.id },
:update => { :success => "cart", :failure => "error" }
form_for
正在打印两次表单标签!
确保您使用 -
而不是 =
调用它。就像在 ERB 中一样,您必须执行
<% form_for stuff do %>
...
<% end %>
在 Haml 中,您必须执行
- form_for stuff do
...
我已经安装了 Haml。为什么 Rails(只查找 .html.erb
文件 | 将 Haml 文件渲染为纯文本 | 将 Haml 文件渲染为空白页面)?
出现这些问题可能有多种原因。首先,请确保 Haml 确实已安装;您已加载 gem(通过 Rails 2.3 中的 config.gem
或 Rails 3 中的 Gemfile),或者 vendor/plugins/haml
存在并包含文件。然后尝试重启 Mongrel 或 WEBrick 或您可能正在使用的任何其他服务器。
最后,如果以上方法都不起作用,您可能安装了一些像 Globalize 这样的本地化插件。这类插件通常与 Haml 不兼容。幸运的是,通常有一个简单的解决方法。对于 Globalize,只需编辑 globalize/lib/globalize/rails/action_view.rb
并将
@@re_extension = /\.(rjs|rhtml|rxml)$/
更改为
@@re_extension = /\.(rjs|rhtml|rxml|erb|builder|haml)$/
对于其他插件,搜索一下可能就能找到解决方法。
您还没有回答我的问题!
抱歉!请尝试查看 Haml 参考文档。如果您在其中找不到答案,请随时在 irc.freenode.net 上的 #haml
频道提问,或发送邮件到 邮件列表。