haml中的Ruby块代码

Ale*_*dre 6 haml ruby-on-rails-3

以下代码正在运行

-@items.each do |item|
 %tr
  %td
   =item.quantity
   times
  %td= item.product.title
 end
Run Code Online (Sandbox Code Playgroud)

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

-@items.each { |item|
 %tr
  %td
   =item.quantity
   times
  %td= item.product.title
 }
Run Code Online (Sandbox Code Playgroud)

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

mat*_*att 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
Run Code Online (Sandbox Code Playgroud)

请注意,Haml并不总是end仅禁用关键字end.您可以将它们与语句修饰符一起使用,例如:

- @things.each do |thing|
  %p= thing.to_s
-end unless @dont_show_things
Run Code Online (Sandbox Code Playgroud)

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

= @things.map do |thing|
  - do_something_with(thing)
-end.join(",")
Run Code Online (Sandbox Code Playgroud)

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

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


tho*_*ron 5

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

- @items.each do |item|
  %tr
    %td
      = item.quantity
      times
    %td= item.product.title
Run Code Online (Sandbox Code Playgroud)

编辑:使用{将抛出语法错误.