Hamlで条件がtrueの場合にクラスを追加


155

もし 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

よりシンプルでhaml固有の方法はありますか?

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

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

回答:



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
それほど簡潔ではありませんが、ヘルパーに入れると他の方法よりも良く見えます。
Simon Perepelitsa 2010

3
これはうまくいきます- .compact.join(" ")しかし、あなたはそれを必要としないことに気づきました。簡単にできます:class => ["post active", ("gray" unless post.published?)]
Stenerson、2014

15

本当に最良のことはそれをヘルパーに入れることです。

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

#some_helper.rb

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

これをヘルパーファイルに入れましたが、「ポスト」変数がないことがアプリから通知されます。
Simon Perepelitsa 2010

2
fyi:特定の場合にのみクラスを含め、他の場合には何も含めない場合は、設定するだけでnil属性は設定されませんclass=""
MMachinegun

14

HAMLには、これを処理するための優れた方法が組み込まれています。

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

これが機能する方法は、条件が評価され、trueの場合、ストリングがクラスに含まれます(含まれない場合)。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.