如何在标签中有条件地包装一些HAML内容?

时间:2011-08-29 23:51:43

标签: html haml

如何使用条件来决定是否在HAML中输出周围标记?我正在尝试创建下面代码的DRY版本。

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

2 个答案:

答案 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