haml中的Ruby块代码

时间:2012-08-07 08:46:25

标签: ruby-on-rails-3 haml

以下代码正在运作

-@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
 }

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

2 个答案:

答案 0 :(得分:13)

在您的工作示例中,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 hardcoded string end is added to close any blocks as needed时。可以修改Haml以便能够使用do..end{},但额外的复杂性可能不值得。这种方式更适合使用do...end用于多行块的常用Ruby习惯用法,{}用于单行块用法。

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

答案 1 :(得分:5)

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

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

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