有条件地为元素添加多个类

Dan*_*ton 2 ruby haml ruby-on-rails

假设我有一些@stuff,我正在渲染一个表格,每个表格都有一些属性thing.我希望每隔一行的颜色不同,所以我使用的是典型的cycle技巧:

%table
  - @stuff.each do |thing|
  %tr{ class: cycle('even', 'odd') }
    %td thing.bleep
    %td thing.bloop
Run Code Online (Sandbox Code Playgroud)

但我还希望根据与每个特定相关的某些条件来不同地呈现某些行thing.所以我希望某些行foo类,如果thing.foo?是真的话.如果我不做这cycle件事,我会这样做:

%tr{ class: 'foo' if thing.foo? }
Run Code Online (Sandbox Code Playgroud)

有没有方便的方法来做这两件事?或者我是否真的必须亲自编写丑陋的逻辑来有条件地将这些东西与中间的空间连在一起?感觉就像那种繁琐的逻辑容易出错,而且我应该使用一个抽象来构成这两个CSS类的改动.

mat*_*att 9

您可以使用数组classid属性:

:class:id属性也可以指定为一个Ruby数组,其元素将被连接在一起.甲:class阵列加入了与""和一个:id阵列被加入了与"_".

所以在这种情况下你可以这样做:

%tr{:class => [cycle('even', 'odd'), ('foo' if thing.foo?)]}
Run Code Online (Sandbox Code Playgroud)

任何nils都将从数组中删除,因此您不会得到额外的空格