Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HAML: Create container/wrapper element only if condition is true

Longshot, but I'm wondering if there's any way to do something like this:

%p # ONLY SHOW THIS IF LOCAL VARIABLE show_paras IS TRUE
  = name

In other words, it always shows the content inside, but it only wraps a container around it if (some-condition) is true.

like image 653
mahemoff Avatar asked Dec 26 '11 13:12

mahemoff


4 Answers

- haml_tag_if show_paras, :p do
  = name

https://github.com/haml/haml/commit/66a8ee080a9fb82907618227e88ce5c2c969e9d1

like image 143
Richard Peck Avatar answered Nov 19 '22 06:11

Richard Peck


You could use raw html, but then you'd have to have the if statement both at the beginning and end:

- if show_paras
  <p>
= name
- if show_paras
  </p>

Assuming you're doing more than just = name, you could use a partial:

- if show_paras
  %p= render "my_partial"
- else
  = render "my_partial"

You could also use HAML's surround (though this is a little messy):

- surround(show_paras ? "<p>" : "", show_paras ? "</p>" : "") do
  = name

Finally, what I would probably do is not try to omit the p tag at all, and just use CSS classes to set up two different p styles to look the way I want:

%p{:class => show_paras ? "with_paras" : "without_paras"}
  = name
like image 24
Dylan Markow Avatar answered Nov 19 '22 06:11

Dylan Markow


Another option is to wrap it in an alternative tag if the condition isn't met, using haml_tag:

- haml_tag(show_paras ? :p : :div) do
  = name
like image 40
Jamie Schembri Avatar answered Nov 19 '22 04:11

Jamie Schembri


The cleanest way I can think of doing is like this:

= show_paras ? content_tag(:p, name) : name

But it's not exactly haml.

Generally markup is the for the content, so if show_paras is a more presentational tweak you should probably be using css to change the behaviour of the %p instead

like image 44
Andrew Nesbitt Avatar answered Nov 19 '22 06:11

Andrew Nesbitt