Pregunta

En cada aplicación web que construyo, me encuentro con este problema. Quiero establecer clases de elementos HTML de forma condicional. Por ejemplo, a veces el <div> para un puesto se ve así:

<div class="post">...</div>

Y a veces se parece a esto:

<div class="post even recent replied_to author_is_admin">...</div>

Cada clase después post está ahí porque algo de lógica decidió que debería ser. ¿Cuál es la mejor manera de esto? En Rails + HAML, he sido culpable de hacer cosas como:

-classes = []
-classes << cycle('even', 'odd')
-classes << 'recent' if post.recent?
-classes << 'replied_to' if post.replied_to?
-classes << 'author_is_admin' if post.author_is_admin?
.post{:class => classes.join(' ')}
    ...

No es bonito, y lo he acortado que utilice un ayudante para que pueda hacer esto:

.post{:class => "#{cycle('even', 'odd')} #{post_classes}"}

Todavía parece que debería ser más fácil de leer, porque es algo que hacemos todo el tiempo. Lo hace usted tiene cualquier método por el cual se realice este proceso corto y fácil de leer?

¿Fue útil?

Solución

Creo que lo que ha hecho está bien. Me gustaría sugerir algunas mejoras menores. Una de ellas sería poner la llamada de ciclo en post_classes. Para facilitar la lectura, me gustaría hacer post_classes aceptar el argumento Post. Esto crea un poco de redundancia, pero se puede evitar fácilmente mediante la definición de este método de ayuda:

def classes(object)
  case object
  when Post then post_classes(object)
  end
end

De este modo, el código de la plantilla se vería así:

.post{:class => classes(Post)}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top