Ocasionalmente tengo que agregar una clase a un elemento html según una condición. El problema es que no puedo encontrar una forma limpia de hacerlo. Aquí hay un ejemplo de las cosas que he probado:
<div <%= if @status = 'success'; "class='ok'"; end %>>
some message here
</div>
O
<% if @status == 'success' %>
<div class='success'>
<% else %>
<div>
<% end %>
some message here
</div>
No me gusta el primer enfoque porque se ve abarrotado y es difícil de leer. No me gusta el segundo enfoque porque el anidamiento está arruinado. Sería bueno ponerlo en el modelo, (algo así como @status.css_class
), pero eso no pertenece allí. ¿Qué hace la mayoría de la gente?
fuente
Evitando la lógica en las vistas
El problema con el enfoque estándar es que requiere lógica en forma de
if
declaraciones o ternarios en la vista. Si tiene varias clases CSS condicionales mezcladas con clases predeterminadas, entonces necesita poner esa lógica en una interpolación de cadenas o etiqueta ERB.Aquí hay un enfoque actualizado que evita poner lógica en las vistas:
class_string
métodoEl
class_string
ayudante toma un hash con pares clave / valor que consisten en cadenas de nombres de clases CSS y valores booleanos . El resultado del método es una cadena de clases donde el valor booleano se evalúa como verdadero.Uso de la muestra
Otros casos de uso
Este ayudante se puede utilizar dentro de
ERB
etiquetas o con ayudantes de Rails comolink_to
.Clases una u otra
Para los casos de uso en los que sería necesario un ternario (por ejemplo
@success ? 'good' : 'bad'
), pase una matriz donde el primer elemento es la clase paratrue
y el otro es parafalse
Inspirado por React
Esta técnica está inspirada en un complemento llamado
classNames
(anteriormente conocido comoclassSet
) de FacebookReact
marco front-end .Uso en sus proyectos de Rails
A partir de ahora, la
class_names
función no existe en Rails, pero este artículo le muestra cómo agregarla o implementarla en sus proyectos.fuente
También puede usar content_for helper, especialmente si el DOM está ubicado en un diseño y desea configurar la clase css dependiendo de la carga parcial.
En el diseño:
En el parcial:
Eso es.
fuente