7

下面的代码正在工作

-@items.each do |item|
 %tr
  %td
   =item.quantity
   times
  %td= item.product.title
 end

但是我想使用{ }而不是do ... end. 可能吗?

-@items.each { |item|
 %tr
  %td
   =item.quantity
   times
  %td= item.product.title
 }

由于某种原因,它会引发异常。我做错了什么?

4

2 回答 2

14

在您的工作示例中,该end行被视为原始文本,并将包含在您的输出中。这是有效的,因为您实际上没有end关键字。如果您将此行更改为- end- 即添加连字符(并确保您的缩进正确) - 您将看到如下错误:

Syntax error on line 9: You don't need to use "- end" in Haml. Un-indent to close a block:
- if foo?
  %strong Foo!
- else
  Not foo.
%p This line is un-indented, so it isn't part of the "if" block

请注意,Haml 并不总是不允许end关键字,只有end它自己。您可以将它们与语句修饰符一起使用,例如:

- @things.each do |thing|
  %p= thing.to_s
-end unless @dont_show_things

或者如果你想利用块的结果:

= @things.map do |thing|
  - do_something_with(thing)
-end.join(",")

至于使用{},你不能。当 Haml 将模板编译为 Ruby 时,会添加硬编码字符串end以根据需要关闭任何块。可以修改 Haml 以使用do..endor {},但额外的复杂性可能不值得。这种方式更适合do...end用于多行块和{}单行块的常见 Ruby 习惯用法。

如果{}由于运算符优先级的某些问题而需要使用它可能是创建辅助方法的标志。您的 Haml 模板(或任何语言的模板)不是复杂逻辑的最佳位置,最好将其移动到真正的 Ruby 文件中。

于 2012-08-10T21:45:13.280 回答
5

你不要把任何end东西放在 HAML 中。缩进是语义的。因此,您的代码应为:

- @items.each do |item|
  %tr
    %td
      = item.quantity
      times
    %td= item.product.title

编辑:使用{将引发语法错误。

于 2012-08-07T08:49:49.217 回答