Избегая логики во взглядах
Проблема стандартного подхода состоит в том, что он требует логики в форме ifоператоров или троек в представлении. Если у вас есть несколько условных классов CSS, смешанных с классами по умолчанию, вам необходимо поместить эту логику в интерполяцию строк или тег ERB.
Вот обновленный подход, который позволяет избежать какой-либо логики в представлениях:
<div class="<%= class_string(ok: @success) %>">
some message here
</div>
class_string метод
class_stringПомощник принимает хэш с парами ключ / значение , состоящих из CSS строк имен классов и логических значений . Результатом метода является строка классов, в которых логическое значение оценивается как истина.
Пример использования
class_names(foo: true, bar: false, baz: some_truthy_variable)
# => "foo baz"
Другие варианты использования
Этот помощник можно использовать в ERBтегах или с помощниками Rails, такими как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 %>
Либо / или классы
Для случаев использования, когда потребуется тернар (например @success ? 'good' : 'bad'), передайте массив, где первый элемент - это класс, trueа другой - дляfalse
<div class="<%= [:good, :bad] => @success %>">
В духе React
Эта техника основана на надстройке, называемой classNames(ранее известной как classSet) от FacebookReact интерфейсной среды .
Использование в ваших проектах Rails
На данный момент этой class_namesфункции нет в Rails, но в этой статье показано, как добавить или реализовать ее в ваших проектах.