Je dois parfois ajouter une classe à un élément html basé sur une condition. Le problème est que je n'arrive pas à trouver une façon propre de le faire. Voici un exemple de ce que j'ai essayé:
<div <%= if @status = 'success'; "class='ok'"; end %>>
some message here
</div>
OU
<% if @status == 'success' %>
<div class='success'>
<% else %>
<div>
<% end %>
some message here
</div>
Je n'aime pas la première approche car elle est encombrée et difficile à lire. Je n'aime pas la deuxième approche parce que l'emboîtement est foiré. Ce serait bien de le mettre dans le modèle, (quelque chose comme @status.css_class
), mais cela n'a pas sa place. Que font la plupart des gens?
la source
Éviter la logique dans les vues
Le problème avec l'approche standard est qu'elle nécessite une logique sous la forme d'
if
énoncés ou de ternaires dans la vue. Si vous avez plusieurs classes CSS conditionnelles mélangées avec des classes par défaut, vous devez placer cette logique dans une interpolation de chaîne ou une balise ERB.Voici une approche mise à jour qui évite de mettre de la logique dans les vues:
class_string
méthodeL'
class_string
assistant prend un hachage avec des paires clé / valeur constituées de chaînes de noms de classe CSS et de valeurs booléennes . Le résultat de la méthode est une chaîne de classes où la valeur booléenne est évaluée à true.Exemple d'utilisation
Autres cas d'utilisation
Cet assistant peut être utilisé dans des
ERB
balises ou avec des assistants Rails tels quelink_to
.Soit / Ou Classes
Pour les cas d'utilisation où un ternaire serait nécessaire (par exemple
@success ? 'good' : 'bad'
), passez un tableau où le premier élément est la classe pourtrue
et l'autre pourfalse
Inspiré par React
Cette technique est inspirée d'un add-on appelé
classNames
(anciennement connu sous le nomclassSet
) duReact
framework frontal de Facebook .Utilisation dans vos projets Rails
Pour le moment, la
class_names
fonction n'existe pas dans Rails, mais cet article vous montre comment l'ajouter ou l'implémenter dans vos projets.la source
Vous pouvez également utiliser l'assistant content_for, en particulier si le DOM est situé dans une mise en page et que vous souhaitez définir la classe css en fonction du partiel chargé.
Sur la mise en page:
Sur le partiel:
C'est ça.
la source