Ответ 1
.post{:class => ("gray" unless post.published?)}
Если post.published?
.post
/ Post stuff
В противном случае
.post.gray
/ Post stuff
Я реализовал это с помощью помощника rails и кажется уродливым.
= 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
.post{:class => ("gray" unless post.published?)}
- 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
На самом деле лучше всего поставить его в помощника.
%div{ :class => published_class(post) }
#some_helper.rb
def published_class(post)
"post #{post.published? ? '' : 'gray'}"
end
У HAML есть хороший встроенный способ справиться с этим:
.post{class: [!post.published? && "gray"] }
Способ, которым это работает, заключается в том, что условное вычисляется и если оно истинно, строка включается в классы, если она не будет включена.