Добавить класс, если условие истинно в Haml - PullRequest
149 голосов
/ 11 августа 2010

Если post.published?

.post
  / Post stuff

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

.post.gray
  / Post stuff

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

= 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

Ответы [ 5 ]

319 голосов
/ 11 августа 2010
.post{:class => ("gray" unless post.published?)}
21 голосов
/ 11 августа 2010
- 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
14 голосов
/ 10 июня 2015

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

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

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

14 голосов
/ 11 августа 2010

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

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

#some_helper.rb

def published_class(post)
  "post #{post.published? ? '' : 'gray'}"
end
2 голосов
/ 14 сентября 2018

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

.post{class: ("gray" unless post.published?)}
...