schlanke dynamische bedingte Klasse [geschlossen]

100

Nur um anderen Entwicklern zu helfen, denn es gibt keine ähnliche Frage zu SO.

div class=(is_active? ? 'active' : 'inactive')
div class=('active' if is_active?)
Sergey Alekseev
quelle

Antworten:

142

Siehe die folgenden Beispiele:

div class=(is_active? ? 'active' : 'inactive')
div class=('active' if is_active?)

Der gleiche Ansatz kann verwendet werden, um anderen Attributen dynamische Werte zuzuweisen.

Sergey Alekseev
quelle
2
Wie würden Sie das für mehrere Bedingungen tun?
Maxim Zubarev
Siehe unten in den Kommentaren zu Ihrer Antwort.
Sergey Alekseev
3
Dies kann auch eine Klasse anhängen, wie zum Beispiel: div.councilor class=(councilor.retired? ? "retired" : "") erzeugt:div.councilor.retired
Terra Ashley
20

Ich verwende ein Array von Klassen und ein Null-Element, wenn keine Klasse in die Liste aufgenommen werden muss, und ein kompaktes Array, um Null-Elemente zu entfernen und schließlich alle zusammenzufügen.

div class=(["cday", "col-md-1", day.day == 1 ? "col-md-offset-#{day.cwday-1}" : nil].compact.join(' '))
Oleg Kr
quelle
12

Wenn Sie mehrere Bedingungen haben, mache ich gerade so etwas wie

div class=(('foo ' if is_foo?) + ('bar' if is_bar?))

Obwohl ich es für einen Makel halte, wenn is_bar? Geben Sie false zurück und der generierte HTML-Code führt zu

<div class="foo "></div>

(Der Fehler ist das leere Zeichen nach dem foo). Wenn jemand eine Lösung dafür hätte, wäre das großartig.

Maxim Zubarev
quelle
7
Versuchen Sie es String#rstripin diesem Fall mit 2 Bedingungen : div class=((('foo ' if is_foo?) + ('bar' if is_bar?)).rstrip). Oder div class=([('foo' if is_foo?), ('bar' if is_bar?)].compact.join(' '))für mehrere Bedingungen.
Sergey Alekseev