在Haml中,如果条件为真,则追加类

160

如果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

有没有更简单、更 Haml 特定的方法?

更新:虽然还是 Haml 特定的,但依然不够简单:

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

336
.post{:class => ("gray" unless post.published?)}

76
多个条件的侧面注意事项: {class: [('class1',除非condition1),('class2'如果condition2)]}...等等 - Mohammad AbuShady
6
多条件情况更简洁的写法: { class:[ (:class1 如果 cond1 成立), (:class2 如果 cond2 成立) ] } - Phrogz
3
注意:(括号是必需的,否则您将会得到Ruby语法错误。) - Topher Fangio
更新后的 JSON 格式:.post{class: ("gray" unless post.published?)} - Robert Travis Pierce

22
- 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
3
这样做效果很好 - 我注意到你不需要 .compact.join(" ")。你可以简单地这样做 :class => ["post active", ("gray" unless post.published?)] - Stenerson

15

最好将其放入一个帮助程序中。

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

#some_helper.rb

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

我把这个放在我的帮助文件中,但是我的应用程序告诉我没有“post”变量。 - Simon Perepelitsa
2
如果您只想在某些情况下包含一个类而在其他情况下不包含任何内容,您可以将其设置为“nil”,这样属性就不会被设置,而不是设置为“class =”“”。 - MMachinegun

14

HAML有一种很好的内置方式来处理这个问题:

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

条件判断会被执行,如果为真,该字符串将包含在类中,否则它将不会被包含。


6

更新了Ruby语法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接