多个多行HAML块

使用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' | 

有更好的吗?

这是一个function,而不是一个bug。 Hamlmultithreading块有意笨重 – 包括难以一个接一个地跟随 – 因为几乎所有时候最好将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' | 

我遇到了与此处提到的相同的问题和解决方法,HAML关于多行块的奇怪(也就是说,它很奇怪)行为已经咬了我很多次。 我知道这是故意的,它可能是为了迫使用户使他的代码更容易阅读。 然而,众所周知,每个开发人员在构建代码时都有自己的偏好。 HAML是我所知道的唯一语言(c,c ++,ruby,python,HTML等),试图强加这样的限制。

调用奇怪的多行处理function而不是错误,只表示语言设计有缺陷。 最终它将永远是用户眼中的一个错误。 多行支持是任何主流语言的基本function,缺少此function只是简单的宣传 – 就像M $ paperclip一样,我认为这也是一个引导用户的尝试。

话虽这么说,HAML是一种非常紧凑和有用的HTML编写语言。 我们这些(在某些情况下)喜欢多行块的人会喜欢至少提供某种配置选项来启用/禁用合适的多行块支持 – 无论语言设计者对“易读代码”的个人定义如何”。

在我们到达那里之前,我想我们将不得不使用“ – #”hack来解决这个问题…

你可以在助手上使用一个块,产生任何有意义的东西。

 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' 

这是一个hack(排序),但你总是可以在链中的第2,第3等行使用“+”而不是“=”。

 = 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' |