Evitando lógica nas visualizações
O problema com a abordagem padrão é que ela requer lógica na forma de ifdeclaraçõ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_stringauxiliar 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 ERBtags 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 truee 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 Reactfront-end do Facebook .
Usando em seus projetos Rails
A partir de agora, a class_namesfunção não existe no Rails, mas este artigo mostra como adicioná-la ou implementá-la em seus projetos.