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.