Anexar classe se a condição for verdadeira no Haml

155

E se post.published?

.post
  / Post stuff

De outra forma

.post.gray
  / Post stuff

Eu implementei isso com o Rails Helper e parece feio.

= 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

Existe uma maneira mais simples e específica de haml?

UPD. Haml-specific, mas ainda não é simples:

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

Respostas:

331
.post{:class => ("gray" unless post.published?)}
Nathan Weizenbaum
fonte
73
apenas uma nota lateral para várias condições `{class: [('class1' a menos que condição1), ('class2' se condição2)]}` ... etc ''
Mohammad AbuShady
5
Mais sucinto para várias condições:{ class:[ (:class1 if cond1), (:class2 if cond2) ] }
Phrogz 02/05
1
Nota: os parênteses são obrigatórios ou você receberá um erro de sintaxe 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
yfeldblum
fonte
1
Não é tão conciso, mas parece melhor do que outras maneiras, se colocado em um ajudante.
Simon Perepelitsa
3
Isso funciona bem - notei que você não precisa disso .compact.join(" "). Você pode simplesmente fazer:class => ["post active", ("gray" unless post.published?)]
Stenerson
15

Realmente a melhor coisa é colocá-lo em um ajudante.

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

#some_helper.rb

def published_class(post)
  "post #{post.published? ? '' : 'gray'}"
end
marca
fonte
Coloquei isso no meu arquivo auxiliar, mas meu aplicativo diz que não há variável "post".
Simon Perepelitsa
2
FYI: se só deseja incluir uma classe em um determinado caso e nada em outros casos você pode apenas definir nile o atributo não será definido, em vez de configuraçãoclass=""
MMachinegun
14

O HAML tem um bom modo de lidar com isso:

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

A maneira como isso funciona é que a condicional é avaliada e, se verdadeira, a cadeia de caracteres é incluída nas classes; caso contrário, não será incluída.

Jared
fonte
5

Sintaxe Ruby atualizada:

.post{class: ("gray" unless post.published?)}
Drew Haines
fonte