如何使用条件来决定是否在HAML中输出周围标记?我正在尝试创建下面代码的DRY版本。
- if i_should_link
%a{:href => url}
.foo
.block
.of
.code
- else
.foo
.block
.of
.code
答案 0 :(得分:31)
你可以使用部分。
<强> 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 :(得分:22)
我认为在大多数情况下,奥迪建议使用部分内容可能是最好的。
然而,作为替代解决方案,我找到了a thread Nathan Weizenbaum建议定义此方法:
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>
他提出将此添加到Haml::Helpers
的想法,但doesn't appear to have happened yet。