Agregar clase si la condición es verdadera en Haml


155

Si post.published?

.post
  / Post stuff

De otra manera

.post.gray
  / Post stuff

He implementado esto con rails helper y parece feo.

= content_tag :div, :class => "post" + (" gray" unless post.published?).to_s do
  / Post stuff

Segunda variante:

= content_tag :div, :class => "post" + (post.published? ? "" : " gray") do
  / Post stuff

¿Hay una manera más simple y específica de haml?

UPD Específico de Haml, pero aún no es simple:

%div{:class => "post" + (" gray" unless post.published?).to_s}
  / Post stuff

Respuestas:


331
.post{:class => ("gray" unless post.published?)}

73
solo una nota al margen para múltiples condiciones `{clase: [('clase1' a menos que condición1), ('clase2' si condición2)]}` .. etc.
Mohammad AbuShady

55
Más sucinto para múltiples afecciones:{ class:[ (:class1 if cond1), (:class2 if cond2) ] }
Phrogz

1
Nota: los paréntesis son obligatorios o obtendrá un error de sintaxis ruby.
Topher Fangio

21
- classes = ["post", ("gray" unless post.published?)]
= content_tag :div, class: classes do
  /Post stuff

def post_tag post, &block
  classes = ["post", ("gray" unless post.published?)]
  content_tag :div, class: classes, &block
end

= post_tag post
  /Post stuff

1
No es tan conciso, pero se ve mejor que otras formas si se lo ayuda.
Simon Perepelitsa

3
Esto funciona bien: me di cuenta de que no es necesario .compact.join(" "). Simplemente puedes hacerlo:class => ["post active", ("gray" unless post.published?)]
Stenerson el

15

Realmente lo mejor es ponerlo en un ayudante.

%div{ :class => published_class(post) }

#some_helper.rb

def published_class(post)
  "post #{post.published? ? '' : 'gray'}"
end

Lo puse en mi archivo de ayuda, pero mi aplicación me dice que no hay una variable "post".
Simon Perepelitsa

2
para su información: si solo desea incluir una clase en un caso determinado y nada en otros casos, simplemente puede establecer nily el atributo no se establecerá, en lugar de establecerloclass=""
MMachinegun

14

HAML tiene una forma agradable de manejar esto:

.post{class: [!post.published? && "gray"] }

La forma en que esto funciona es que el condicional se evalúa y, si es verdadero, la cadena se incluye en las clases, de lo contrario no se incluirá.


5

Sintaxis actualizada de Ruby:

.post{class: ("gray" unless post.published?)}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.