多个多线HAML块(Multiple multi-line HAML blocks)

2019-07-19 11:31发布

使用HAML的(故意)怪多行格式,我想在我的模板下面几行:

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

-# and

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

然而,它们不能相对于彼此运行起来,或者它们被读取为一个单一的多行块。

-# This fails:
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

并带有换行符分离,有趣的是,确实没有更好的:

-# This fails, too:
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

唯一的工作解决我发现是运行之间的Ruby代码一个空行。 这看起来很丑陋。

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |
-
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

有更好的吗?

Answer 1:

这是一个功能,而不是一个错误。 Haml的多块是故意笨拙 - 包括难以遵循一个又一个 - 因为几乎所有的,最好的时间把那个Ruby代码到一个帮手。 即使助手只调用一次,它会让你的模板更容易阅读。 例如:

def blatz_link
  call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3',
    :foo4 => 'bar4', :foo5 => 'bar5'
end

def blootz_link
  call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3',
    :foo4 => 'bar4', :foo5 => 'bar5'
end

然后在你的Haml的,只是做

= blatz_link
= blootz_link

这将是更容易阅读和理解。


如果你绝对必须遵循一个多块与另一个,只添加之间的评论:

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |
-#
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |


Answer 2:

我遇到同样的问题,并为已经被这里提到的解决方法,以及怪异的(是的,这是奇怪)对于多线块HAML的行为咬了我好几次。 我知道这是故意的,它很可能意在迫使用户做出自己的代码更易于阅读。 然而,这是一个众所周知的事实,每个开发人员都有他自己的喜好,当涉及到结构的代码。 HAML是我知道(C,C ++,红宝石,蟒蛇,HTML等),试图强加这种限制的唯一语言。

调用怪异的多线处理功能,而不是一个错误,只是表明一个有缺陷的语言设计。 最后,它总是会在用户眼中的错误。 多行的支持是任何主流语言的基本特征,缺少此功能的只是普通annoing - 就像M $回形针,我相信也是为了引导用户的尝试。

话虽这么说,HAML是编写HTML一个极其紧凑和有用的语言。 我们这些谁(在某些情况下),喜欢的多线块会很喜欢这样至少可以提供某种配置选项来启用/禁用体面的多路块的支持 - 无论“容易阅读代码的语言设计师的个人定义的”。

直到我们到达那里,我想我们必须解决使用的语言“ - #”黑客...



Answer 3:

你可以在你的助手使用块,产生任何有意义的。

module SomeHelper
  def call_to_helper
    foo = Foo.new
    yield foo
    # build your html here, using the foo object's attributes
  end

  class Foo
    attr_accessor :foo1, :foo2, :foo3, :foo4, :foo5
  end

end

现在您HAML:

= call_to_helper do |foo|
  -foo.foo1 = 'bar1'
  -foo.foo2 = 'bar2'
  -foo.foo3 = 'bar3'
  -foo.foo4 = 'bar4'
  -foo.foo5 = 'bar5'

= call_to_helper do |foo|
  -foo.foo1 = 'bar1'
  -foo.foo2 = 'bar2'
  -foo.foo3 = 'bar3'
  -foo.foo4 = 'bar4'
  -foo.foo5 = 'bar5'


Answer 4:

这是一个黑客(排序),但你总是可以在你的第二,第三等在划线用的“=”一个“+”代替。

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |
+ call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |


文章来源: Multiple multi-line HAML blocks