【问题标题】:Ruby block code in hamlhaml 中的 Ruby 块代码
【发布时间】:2012-08-07 08:46:25
【问题描述】:

下面的代码正在运行

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

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

【问题讨论】:

  • 你不能。这就是 HAML 的工作原理。

标签: ruby-on-rails-3 haml


【解决方案1】:

在您的工作示例中,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{},但额外的复杂性可能不值得。这种方式更适合常见的 Ruby 习惯用法,即使用do...end 处理多行块,使用{} 处理单行块。

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

【讨论】:

【解决方案2】:

您不要在 HAML 中添加任何 end。缩进是语义的。因此,您的代码应该是:

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

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

【讨论】:

  • 我问的是{},而是do ... end
  • 我知道使用end 是多余的。但它不会抛出错误。
  • 它不会抛出错误,因为它被视为文本。评估您的代码实际上会在 HTML 代码中显示“结束”。
  • 我不知道为什么这被否决了,建议是正确的。我投了赞成票。
猜你喜欢
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
相关资源
最近更新 更多