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

谁说我不能喝 提交于 2019-11-26 17:22:57

问题


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

回答1:


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



回答2:


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.



来源:https://stackoverflow.com/questions/7237308/how-can-i-conditionally-wrap-some-haml-content-in-a-tag

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!