多个多行HAML块

时间:2009-09-24 22:06:02

标签: ruby-on-rails 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' |

有什么更好的吗?

4 个答案:

答案 0 :(得分:25)

这是一个功能,而不是一个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

然后在你的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' |

答案 1 :(得分:8)

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

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

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

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

答案 2 :(得分: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'

答案 3 :(得分:2)

这是一个黑客(排序),但你总是可以在你的第二,第三等行中使用“+”而不是“=”。

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