Aggiungi classe se la condizione è vera in Haml


155

Se post.published?

.post
  / Post stuff

Altrimenti

.post.gray
  / Post stuff

L'ho implementato con l'aiuto delle rotaie e sembra brutto.

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

Seconda variante:

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

Esiste un modo più semplice e specifico per gli haml?

UPD. Specifico per Haml, ma non ancora semplice:

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

Risposte:


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

73
solo una nota a margine per più condizioni `{class: [('class1' a meno di condition1), ('class2' se condition2)]}` .. ecc.
Mohammad AbuShady,

5
Più conciso per molteplici condizioni:{ class:[ (:class1 if cond1), (:class2 if cond2) ] }
Phrogz,

1
Nota: le parentesi sono obbligatorie o si otterrà un errore di sintassi rubino.
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

1
Non così conciso, ma sembra migliore di altri modi se messo in un aiuto.
Simon Perepelitsa,

3
Funziona bene - ho notato che non ti serve .compact.join(" ")però. Puoi semplicemente farlo:class => ["post active", ("gray" unless post.published?)]
Stenerson,

15

Davvero la cosa migliore è metterlo in un aiuto.

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

#some_helper.rb

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

L'ho inserito nel mio file di supporto, ma la mia app mi dice che non esiste una variabile "post".
Simon Perepelitsa,

2
a proposito: se vuoi solo includere una classe in un determinato caso e nulla in altri casi puoi semplicemente impostare nile l'attributo non verrà impostato, invece di impostareclass=""
MMachinegun

14

HAML ha un bel modo per gestire questo:

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

Il modo in cui funziona è che il condizionale viene valutato e, se vero, la stringa viene inclusa nelle classi, altrimenti non verrà inclusa.


5

Sintassi Ruby aggiornata:

.post{class: ("gray" unless post.published?)}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.