web-dev-qa-db-ja.com

Hamlで条件がtrueの場合、クラスを追加します

post.published?

.post
  / Post stuff

そうでなければ

.post.gray
  / Post stuff

これをRailsヘルパーで実装しましたが、見苦しいようです。

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

2番目のバリアント:

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

もっとシンプルでハム特有の方法はありますか?

UPD。 Haml固有ですが、それでも単純ではありません:

%div{:class => "post" + (" gray" unless post.published?).to_s}
  / Post stuff
149
.post{:class => ("gray" unless post.published?)}
321
- 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
21
yfeldblum

HAMLには、これを処理するために構築されたNiceがあります。

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

これが機能する方法は、条件が評価され、trueの場合、文字列が含まれない場合、クラスに含まれることです。

14
Jared

本当に一番いいのは、ヘルパーに入れることです。

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

#some_helper.rb

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

更新されたRuby構文:

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