Evitando lógica nas visualizações
O problema com a abordagem padrão é que ela requer lógica na forma de if
declarações ou ternários na visualização. Se você tiver várias classes CSS condicionais misturadas com classes padrão, precisará colocar essa lógica em uma interpolação de string ou tag ERB.
Esta é uma abordagem atualizada que evita colocar qualquer lógica nas visualizações:
<div class="<%= class_string(ok: @success) %>">
some message here
</div>
class_string
método
O class_string
auxiliar recebe um hash com pares de chave / valor consistindo em strings de nome de classe CSS e valores booleanos . O resultado do método é uma string de classes onde o valor booleano é avaliado como verdadeiro.
Uso de amostra
class_names(foo: true, bar: false, baz: some_truthy_variable)
# => "foo baz"
Outros casos de uso
Este helper pode ser usado dentro de ERB
tags ou com helpers Rails como link_to
.
<div class="<%= class_string(ok: @success) %>">
some message here
</div>
<% div_for @person, class: class_string(ok: @success) do %>
<% end %>
<% link_to "Hello", root_path, class: class_string(ok: @success) do %>
<% end %>
Classes ou classes
Para casos de uso em que um ternário seria necessário (por exemplo @success ? 'good' : 'bad'
), passe uma matriz onde o primeiro elemento é a classe para true
e o outro é parafalse
<div class="<%= [:good, :bad] => @success %>">
Inspirado por React
Essa técnica é inspirada por um add-on chamado classNames
(anteriormente conhecido como classSet
) da estrutura de React
front-end do Facebook .
Usando em seus projetos Rails
A partir de agora, a class_names
função não existe no Rails, mas este artigo mostra como adicioná-la ou implementá-la em seus projetos.