Избежание логики в представлениях
Проблема стандартного подхода заключается в том, что он требует логики в виде if
операторов или троичных выражений в представлении. Если у вас есть несколько условных CSS-классов, смешанных с классами по умолчанию, вам нужно поместить эту логику в строковую интерполяцию или тег ERB.
Вот обновленный подход, позволяющий избежать введения какой-либо логики в представления:
<div class="<%= class_string(ok: @success) %>">
some message here
</div>
class_string
метод
Помощник class_string
получает хеш с парами ключ / значение, состоящими из строк имени класса CSS и логических значений . Результатом метода является строка классов, в которой логическое значение оценивается как true.
Пример использования
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
) из React
фреймворка Facebook.
Использование в ваших Rails проектах
На данный момент функция class_names
не существует в Rails, но эта статья показывает, как добавить или внедрить ее в свои проекты.