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

这有什么好?

有帮助吗?

解决方案

这是一个功能,不是一个错误。 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' |

其他提示

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

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

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

直到我们到达那里,我想我们还会有解决的语言“ - #”黑客...

您可以在您的帮助者使用块,产生任何有意义的。

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'

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

= 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' |
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top