Ajouter une classe si la condition est vraie dans Haml

155

Si post.published?

.post
  / Post stuff

Autrement

.post.gray
  / Post stuff

J'ai implémenté cela 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 plus spécifique au hameau?

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

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

Réponses:

331
.post{:class => ("gray" unless post.published?)}
Nathan Weizenbaum
la source
73
juste une note d'accompagnement pour plusieurs conditions `{class: [('class1' sauf condition1), ('class2' if condition2)]}` .. etc
Mohammad AbuShady
5
Plus succinct pour plusieurs conditions:{ class:[ (:class1 if cond1), (:class2 if cond2) ] }
Phrogz
1
Remarque: les parenthèses sont obligatoires ou vous obtiendrez une erreur de syntaxe ruby.
Topher Fangio
21
- 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
Yfeldblum
la source
1
Pas si concis, mais semble meilleur que d'autres moyens s'il est mis dans une aide.
Simon Perepelitsa
3
Cela fonctionne bien - j'ai remarqué que vous n'en avez pas besoin .compact.join(" "). Vous pouvez simplement faire:class => ["post active", ("gray" unless post.published?)]
Stenerson
15

Vraiment, le mieux est de le mettre dans une aide.

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

#some_helper.rb

def published_class(post)
  "post #{post.published? ? '' : 'gray'}"
end
marque
la source
J'ai mis ceci dans mon fichier d'aide, mais mon application me dit qu'il n'y a pas de variable "post".
Simon Perepelitsa
2
fyi: si vous ne voulez inclure une classe que dans un certain cas et rien dans d'autres cas, vous pouvez simplement définir nilet l'attribut ne sera pas défini, au lieu de définirclass=""
MMachinegun
14

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

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

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

Jared
la source
5

Syntaxe Ruby mise à jour:

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