classe conditionnelle dynamique slim [fermée]

100

Juste pour aider d'autres développeurs, car il n'y a pas de question similaire sur SO.

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

Réponses:

144

Voir les exemples ci-dessous:

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

La même approche peut être utilisée pour attribuer des valeurs dynamiques à d'autres attributs.

Sergey Alekseev
la source
2
Comment feriez-vous cela pour plusieurs conditions?
Maxim Zubarev
Voir ci-dessous dans les commentaires à votre réponse.
Sergey Alekseev
3
Cela peut également ajouter une classe, telle que: div.councilor class=(councilor.retired? ? "retired" : "") génère:div.councilor.retired
Terra Ashley
20

J'utilise un tableau de classes et un élément nil s'il n'est pas nécessaire d'inclure une classe dans la liste, puis un tableau compact pour supprimer les éléments nil et enfin les assembler.

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

Si vous avez plusieurs conditions, je suis en train de faire quelque chose comme

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

Bien que je pense que c'est une tache si is_bar? renvoie false et le HTML généré entraîne

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

(le défaut est le caractère vide après le foo). Si quelqu'un avait une solution pour cela, ce serait génial.

Maxim Zubarev
la source
7
Essayez String#rstripdans ce cas avec 2 conditions: div class=((('foo ' if is_foo?) + ('bar' if is_bar?)).rstrip). Ou div class=([('foo' if is_foo?), ('bar' if is_bar?)].compact.join(' '))pour plusieurs conditions.
Sergey Alekseev