简体   繁体   中英

How can I conditionally wrap some HAML content in a tag?

How can I use a condition to decide whether to output a surrounding tag in HAML? I'm trying to create the DRY version of the code below.

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

You could use a partial.

foo.html.haml

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

_bar.html.haml

.foo
  .block
    .of
      .code

Edit: Or you could use content for, I guess this is better because it keeps it all in the same file.

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

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

I think odin's suggestion to use a partial is probably the best in most situations.

However, as an alternate solution, I found a thread where Nathan Weizenbaum suggested defining this method:

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

Whatever is in the block would always be rendered , but the wrapping tag would appear or not based on the condition.

You would use it as follows:

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

If planning_to_mail? evaluates true , you'd get:

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

If it evaluates false , you'd get:

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

He floated the idea of adding this to Haml::Helpers , but that doesn't appear to have happened yet .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM