Haml: Append class if condition is true in Haml

RubyHaml

Ruby Problem Overview


If post.published?

.post
  / Post stuff

Otherwise

.post.gray
  / Post stuff

I've implemented this with rails helper and it seems ugly.

= content_tag :div, :class => "post" + (" gray" unless post.published?).to_s do
  / Post stuff

Second variant:

= content_tag :div, :class => "post" + (post.published? ? "" : " gray") do
  / Post stuff

Is there a more simple and haml-specific way?

UPD. Haml-specific, but still not simple:

%div{:class => "post" + (" gray" unless post.published?).to_s}
  / Post stuff

Ruby Solutions


Solution 1 - Ruby

.post{:class => ("gray" unless post.published?)}

Solution 2 - Ruby

- classes = ["post", ("gray" unless post.published?)]
= content_tag :div, class: classes do
  /Post stuff

def post_tag post, &block
  classes = ["post", ("gray" unless post.published?)]
  content_tag :div, class: classes, &block
end

= post_tag post
  /Post stuff

Solution 3 - Ruby

Really the best thing is to put it into a helper.

%div{ :class => published_class(post) }

#some_helper.rb

def published_class(post)
  "post #{post.published? ? '' : 'gray'}"
end

Solution 4 - Ruby

HAML has a nice built in way to handle this:

.post{class: [!post.published? && "gray"] }

The way that this works is that the conditional gets evaluated and if true, the string gets included in the classes, if not it won't be included.

Solution 5 - Ruby

Updated Ruby syntax:

.post{class: ("gray" unless post.published?)}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSimon PerepelitsaView Question on Stackoverflow
Solution 1 - RubyNathan Weizenbaum View Answer on Stackoverflow
Solution 2 - RubyyfeldblumView Answer on Stackoverflow
Solution 3 - RubymarkView Answer on Stackoverflow
Solution 4 - RubyJaredView Answer on Stackoverflow
Solution 5 - RubyDrew HainesView Answer on Stackoverflow