Добавить класс, если условие истинно в Haml

155

Если post.published?

.post
  / Post stuff

В противном случае

.post.gray
  / Post stuff

Я реализовал это с помощью Rails Helper, и это выглядит ужасно.

= content_tag :div, :class => "post" + (" gray" unless post.published?).to_s do
  / Post stuff

Второй вариант:

= content_tag :div, :class => "post" + (post.published? ? "" : " gray") do
  / Post stuff

Есть ли более простой и специфичный для хамла способ?

UPD. Хамл специфичен, но все же не прост:

%div{:class => "post" + (" gray" unless post.published?).to_s}
  / Post stuff
Симон Перепелица
источник

Ответы:

331
.post{:class => ("gray" unless post.published?)}
Натан Вайзенбаум
источник
73
просто примечание для нескольких условий `{class: [('class1' если не условие1), ('class2' если условие2)]}` .. и т. д.
Мохаммад АбуШади
5
Более кратко для нескольких условий:{ class:[ (:class1 if cond1), (:class2 if cond2) ] }
Phrogz
1
Примечание: скобки обязательны, иначе вы получите ошибку синтаксиса ruby.
Topher Fangio
21
- classes = ["post", ("gray" unless post.published?)]
= content_tag :div, class: classes do
  /Post stuff

def post_tag post, &block
  classes = ["post", ("gray" unless post.published?)]
  content_tag :div, class: classes, &block
end

= post_tag post
  /Post stuff
yfeldblum
источник
1
Не так кратко, но выглядит лучше, чем другие способы, если поместить в помощника.
Симон Перепелица
3
Это хорошо работает - я заметил, что вам не нужно, .compact.join(" ")хотя. Вы можете просто сделать:class => ["post active", ("gray" unless post.published?)]
Стенерсон
15

На самом деле лучше всего поместить его в помощника.

%div{ :class => published_class(post) }

#some_helper.rb

def published_class(post)
  "post #{post.published? ? '' : 'gray'}"
end
отметка
источник
Я поместил это в мой вспомогательный файл, но мое приложение сообщает мне, что нет переменной "post".
Симон Перепелица
2
К вашему сведению: если вы хотите включить класс только в определенном случае и ничего в других случаях, вы можете просто установить nilи атрибут не будет установлен вместо установкиclass=""
MMachinegun
14

HAML имеет хороший встроенный способ справиться с этим:

.post{class: [!post.published? && "gray"] }

Способ, которым это работает, состоит в том, что условное условие оценивается, и если оно истинно, строка включается в классы, если нет, она не будет включена.

Джаред
источник
5

Обновлен синтаксис Ruby:

.post{class: ("gray" unless post.published?)}
Дрю Хейнс
источник