使用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' |
有什么更好的吗?
答案 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' |