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

Odpowiedzi:


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

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

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

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.