2010-08-10 2 views
132

Если post.published?Append класс, если условие истинно Haml

.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 

Есть ли более простой и Haml конкретным способом?

UPD. Хэмл-специфический, но все еще не простой:

%div{:class => "post" + (" gray" unless post.published?).to_s} 
/Post stuff 

ответ

287
.post{:class => ("gray" unless post.published?)} 
+61

просто боковое примечание для нескольких условий '{class: [('class1', если условие 1), ('class2', если condition2)]} '.. и т. д. –

+0

Succintct и отлично - спасибо! –

+4

Более кратким для нескольких условий: '{class: [(: class1 if cond1), (: class2 if cond2)]}' – Phrogz

13

Действительно лучше всего положить его в помощника.

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

#some_helper.rb 

def published_class(post) 
    "post #{post.published? ? '' : 'gray'}" 
end 
+0

Я поместил это в свой вспомогательный файл, но мое приложение сообщает мне, что нет переменной «post». –

+1

К сожалению. Изменили ответ. – mark

+2

fyi: если вы хотите включить класс в определенный случай, и ничего в других случаях вы можете просто установить 'nil', а атрибут не будет установлен, вместо установки' class = "" ' – MMachinegun

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 
+1

Не так кратким, но выглядит лучше, чем другие способы, если положить в помощник. –

+3

Это хорошо работает - я заметил, что вам не нужно '.compact.join (" ")' хотя. Вы можете просто сделать ': class => [" post active ", (" gray ", если post.published?)]' – Stenerson

9

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

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

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

Смежные вопросы