web-dev-qa-db-fra.com

Ajouter une classe si la condition est vraie dans Haml

Si post.published?

.post
  / Post stuff

Autrement

.post.gray
  / Post stuff

J'ai implémenté ceci avec Rails helper 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
141
Simon Perepelitsa
.post{:class => ("gray" unless post.published?)}
307
Nathan Weizenbaum
- 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
21
yfeldblum

La meilleure chose à faire est de le mettre dans une aide.

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

#some_helper.rb

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

HAML a une solution intégrée à Nice pour gérer ceci:

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

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

13
Jared

Syntaxe Ruby mise à jour:

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