多个多行HAML块

Mat*_*chu 18 haml ruby-on-rails

使用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' |
Run Code Online (Sandbox Code Playgroud)

但是,它们不能相互碰撞,或者它们被读作单个多行块.

-# 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' |
Run Code Online (Sandbox Code Playgroud)

有趣的是,用换行符分隔并不会更好:

-# 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' |
Run Code Online (Sandbox Code Playgroud)

我发现唯一可行的解​​决方案是在它们之间运行一行空白的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' |
Run Code Online (Sandbox Code Playgroud)

有更好的吗?

Nat*_*aum 28

这是一个功能,而不是一个bug.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
Run Code Online (Sandbox Code Playgroud)

然后在你的Haml,就这么做

= blatz_link
= blootz_link
Run Code Online (Sandbox Code Playgroud)

这将更易读,更容易理解.


如果你绝对必须跟随一个多线块与另一个,请在两者之间添加注释:

= 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' |
Run Code Online (Sandbox Code Playgroud)


小智 9

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

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

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

在我们到达那里之前,我想我们必须使用" - #"hack来解决这个问题...