常见问题解答

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 缩进 pretextarea 标签的内容?

由于 Haml 会自动缩进 HTML 源代码,因此像 pretextarea 这样的对空白敏感的标签的内容可能会被搞乱。解决方法是将这些标签内的换行符替换为 HTML 换行符实体 (&#x000A;),Haml 使用 Haml::Helpers#preserve 和 Haml::Helpers#find_and_preserve 助手来实现。

通常,Haml 会在您使用需要它的标签时自动执行此操作(可以使用 :preserve 选项自定义)。例如,

%p
  %textarea= "Foo\nBar"

将被编译为

<p>
  <textarea>
Foo&#x000A;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&#x000A;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 频道提问,或发送邮件到 邮件列表