Избегая логики во взглядах
Проблема стандартного подхода состоит в том, что он требует логики в форме 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, но в этой статье показано, как добавить или реализовать ее в ваших проектах.