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
ifdeclaraciones 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_stringmétodoEl
class_stringayudante 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
ERBetiquetas 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 paratruey el otro es parafalseInspirado por React
Esta técnica está inspirada en un complemento llamado
classNames(anteriormente conocido comoclassSet) de FacebookReactmarco front-end .Uso en sus proyectos de Rails
A partir de ahora, la
class_namesfunció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