Klasse anhängen, wenn die Bedingung in Haml erfüllt ist

155

Wenn post.published?

.post
  / Post stuff

Andernfalls

.post.gray
  / Post stuff

Ich habe dies mit Rails Helper implementiert und es scheint hässlich.

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

Zweite Variante:

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

Gibt es einen einfacheren und hamlspezifischeren Weg?

UPD. Haml-spezifisch, aber immer noch nicht einfach:

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

Antworten:

331
.post{:class => ("gray" unless post.published?)}
Nathan Weizenbaum
quelle
73
nur eine Randnotiz für mehrere Bedingungen `{class: [('class1' außer Bedingung1), ('class2' wenn Bedingung2)]}` .. etc
Mohammad AbuShady
5
Prägnanter für mehrere Bedingungen:{ class:[ (:class1 if cond1), (:class2 if cond2) ] }
Phrogz
1
Hinweis: Die Klammern sind erforderlich, da sonst ein Ruby-Syntaxfehler angezeigt wird.
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
quelle
1
Nicht so prägnant, sieht aber besser aus als andere Methoden, wenn sie in einen Helfer gesteckt werden.
Simon Perepelitsa
3
Das funktioniert gut - mir ist aufgefallen, dass du das aber nicht brauchst .compact.join(" "). Sie können einfach tun:class => ["post active", ("gray" unless post.published?)]
Stenerson
15

Wirklich das Beste ist, es in einen Helfer zu stecken.

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

#some_helper.rb

def published_class(post)
  "post #{post.published? ? '' : 'gray'}"
end
Kennzeichen
quelle
Ich habe dies in meine Hilfsdatei aufgenommen, aber meine App sagt mir, dass es keine "post" -Variable gibt.
Simon Perepelitsa
2
fyi: Wenn Sie nur eine Klasse in einem bestimmten Fall und nichts in anderen Fällen einschließen möchten, können Sie einfach festlegen nilund das Attribut wird nicht festgelegt, anstatt zu setzenclass=""
MMachinegun
14

HAML hat eine schöne eingebaute Methode, um damit umzugehen:

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

Dies funktioniert so, dass die Bedingung ausgewertet wird und wenn true, wird die Zeichenfolge in die Klassen aufgenommen, andernfalls wird sie nicht aufgenommen.

Jared
quelle
5

Aktualisierte Ruby-Syntax:

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