2011-08-29 54 views
29

如何使用条件来决定是否输出HAML周围的标签?我正在尝试创建下面的代码的DRY版本。如何有条件地将一些HAML内容包装到标签中?

- if i_should_link 
    %a{:href => url} 
    .foo 
    .block 
     .of 
     .code 
- else 
    .foo 
    .block 
     .of 
     .code 
+0

我不太确定这是如何与HTML相关的,如果它是HAML ... – element119

+0

这是一个重复的:http://stackoverflow.com/questions/8636401/haml-create-container-element-only- if-condition-is-true –

回答

28

您可以使用部分。

foo.html.haml

- if i_should_link 
    %a{:href => url} 
    = render 'bar' 
- else 
    = render 'bar' 

_bar.html.haml

.foo 
    .block 
    .of 
     .code 

编辑:或者你可以使用内容,我想这是因为它可以更好将它全部保存在同一个文件中。

- if i_should_link 
    %a{:href => url} 
    = yield :foobar 
- else 
    = yield :foobar 

- content_for :foobar do 
    .foo 
    .block 
     .of 
     .code 
+1

content_for方法非常好。谢谢,奥丁。我会看看是否有其他解决方案进来,让你知道。 –

+7

..他永远不会让我知道:-( – twe4ked

+3

提醒你,你仍然没有答案。你能睡吗?D? – Ven

21

我认为奥丁的建议使用部分可能是在大多数情况下最好的。

然而,作为替代的解决方案,我发现a thread其中森魏泽鲍姆建议定义该方法:

def haml_tag_if(condition, *args, &block) 
    if condition 
    haml_tag *args, &block 
    else 
    yield 
    end 
end 

无论是在该块将总是被渲染,但包裹标签将基于出现或不在条件。

如下你会使用它:

- haml_tag_if(planning_to_mail?, :div, :id => 'envelope') do 
    %p I'm a letter 

如果planning_to_mail?评估true,你会得到:

<div id="envelope"> 
    <p>I'm a letter</p> 
</div> 

如果评估false,你会得到:

<p>I'm a letter</p> 

他飘来加入这的想法,但那doesn't appear to have happened yet

+7

这最近已经被添加到Haml的,但它尚未在释放Haml的4.1或Haml的5查找出它:?https://github.com/haml/haml/commit/66a8ee080a9fb82907618227e88ce5c2c969e9d1 – matt

+0

这是一个奇妙的答案 - 六年,并仍然提供了一个很好的解决方案对于它的价值,我把它换成haml_tag将与辅助content_tag和如上文所述,它工作得。 – SRack

相关问题