Dołącz klasę, jeśli warunek w Haml jest prawdziwy

155

Jeśli post.published?

.post
  / Post stuff

Inaczej

.post.gray
  / Post stuff

Zaimplementowałem to z pomocnikiem rails i wydaje się brzydkie.

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

Drugi wariant:

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

Czy jest bardziej prosty i specyficzny dla Hamla sposób?

UPD. Specyficzne dla Hamla, ale nadal nie jest proste:

%div{:class => "post" + (" gray" unless post.published?).to_s}
  / Post stuff
Simon Perepelitsa
źródło

Odpowiedzi:

331
.post{:class => ("gray" unless post.published?)}
Nathan Weizenbaum
źródło
73
uwaga na marginesie dla wielu warunków `{class: [('class1' chyba że warunek1), ('class2' if condition2)]}` .. etc
Mohammad AbuShady
5
Bardziej zwięzłe dla wielu schorzeń:{ class:[ (:class1 if cond1), (:class2 if cond2) ] }
Phrogz
1
Uwaga: nawiasy są wymagane lub wystąpi błąd składni języka 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
źródło
1
Nie jest tak zwięzły, ale wygląda lepiej niż inne sposoby, jeśli zostanie umieszczony jako pomocnik.
Simon Perepelitsa
3
To działa dobrze - zauważyłem, że nie potrzebujesz .compact.join(" "). Możesz po prostu to zrobić:class => ["post active", ("gray" unless post.published?)]
Stenerson
15

Naprawdę najlepszą rzeczą jest umieszczenie go w pomocniku.

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

#some_helper.rb

def published_class(post)
  "post #{post.published? ? '' : 'gray'}"
end
znak
źródło
Umieściłem to w moim pliku pomocniczym, ale moja aplikacja mówi mi, że nie ma zmiennej „post”.
Simon Perepelitsa
2
fyi: jeśli chcesz dołączyć klasę tylko w określonym przypadku, aw innych nic nie możesz po prostu ustawić, nila atrybut nie zostanie ustawiony, zamiast ustawianiaclass=""
MMachinegun
14

HAML ma ładny sposób radzenia sobie z tym:

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

Sposób, w jaki to działa, polega na tym, że warunek jest oceniany, a jeśli jest prawdziwy, ciąg zostanie uwzględniony w klasach, jeśli nie, nie zostanie uwzględniony.

Jared
źródło
5

Zaktualizowana składnia Rubiego:

.post{class: ("gray" unless post.published?)}
Drew Haines
źródło