如果Haml中的条件为true,则追加类


155

如果 post.published?

.post
  / Post stuff

除此以外

.post.gray
  / Post stuff

我已经用rails helper实现了它,这看起来很丑。

= 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。Haml特有的,但仍然不简单:

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

Answers:



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" unless post.published?)]
Stenerson 2014年

15

真的最好的办法是将其放入助手中。

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

#some_helper.rb

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

我已经把它放在我的帮助文件中,但是我的应用程序告诉我,没有“ post”变量。
西蒙·佩雷佩里察

2
仅供参考:如果您只想在某些情况下包括一个类,而在其他情况下则什么都不做,则可以设置nil该属性,而不是设置该属性,而不是设置class=""
MMachinegun 2014年

14

HAML具有很好的内置方式来处理此问题:

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

它的工作方式是对条件进行求值,如果为true,则将字符串包含在类中,否则将不包含在字符串中。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.