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

Sim*_*tsa 150 ruby haml

如果 post.published?

.post
  / Post stuff
Run Code Online (Sandbox Code Playgroud)

除此以外

.post.gray
  / Post stuff
Run Code Online (Sandbox Code Playgroud)

我用rails helper实现了它,看起来很难看.

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

第二种变体:

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

是否有更简单和特定于haml的方式?

UPD.特定于Haml,但仍然不简单:

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

小智 326

.post{:class => ("gray" unless post.published?)}
Run Code Online (Sandbox Code Playgroud)

  • 只是多条件`{class:[('class1'除非条件1),('class2',如果条件2)}}`..等等的旁注 (72认同)
  • 对于多个条件更简洁:`{class:[(:class1 if cond1),(:class2 if cond2)]}` (5认同)
  • 注意:括号是必需的,否则会出现 ruby​​ 语法错误。 (3认同)

yfe*_*lum 21

- classes = ["post", ("gray" unless post.published?)]
= content_tag :div, class: classes do
  /Post stuff
Run Code Online (Sandbox Code Playgroud)
def post_tag post, &block
  classes = ["post", ("gray" unless post.published?)]
  content_tag :div, class: classes, &block
end

= post_tag post
  /Post stuff
Run Code Online (Sandbox Code Playgroud)

  • 这很好 - 我注意到你不需要`.compact.join("")`.你可以简单地做`:class => ["post active",("grey"除非post.published?)]` (3认同)

mar*_*ark 14

真的最好的事情就是把它变成一个帮手.

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

#some_helper.rb

def published_class(post)
  "post #{post.published? ? '' : 'gray'}"
end
Run Code Online (Sandbox Code Playgroud)

  • fyi:如果你只想在某种情况下包含一个类而在其他情况下什么都没有,你可以设置`nil`并且不会设置属性,而不是设置`class =""` (2认同)

Jar*_*red 14

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

.post{class: [!post.published? && "gray"] }
Run Code Online (Sandbox Code Playgroud)

这种方法的工作方式是条件得到评估,如果为真,则字符串包含在类中,否则不包括在内.


小智 6

更新的 Ruby 语法:

.post{class: ("gray" unless post.published?)}
Run Code Online (Sandbox Code Playgroud)