Ajouter une classe si la condition est vraie dans Haml

Si post.published?

 .post / Post stuff 

Autrement

 .post.gray / Post stuff 

Je l’ai mis en place avec l’aide de rails et cela semble moche.

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

Deuxième variante:

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

Existe-t-il un moyen plus simple et spécifique à haml?

UPD. Spécifique à Haml, mais toujours pas simple:

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

 .post{:class => ("gray" unless post.published?)} 
 - 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 

Vraiment, la meilleure chose est de le mettre dans une aide.

 %div{ :class => published_class(post) } #some_helper.rb def published_class(post) "post #{post.published? ? '' : 'gray'}" end 

HAML a une belle façon de gérer cela:

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

La façon dont cela fonctionne est que le conditionnel est évalué et si vrai, la chaîne est incluse dans les classes, sinon elle ne sera pas incluse.