以下代码正在运作
-@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
}
由于某种原因,它会引发异常。我做错了什么?
答案 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
编辑:使用{
会引发语法错误。