有条件地向视图中的HTML元素添加一个类的方法是什么?

我偶尔需要添加一个类到基于条件的HTML元素。 问题是我无法弄清楚干净的方式。 这是我尝试过的东西的一个例子:

<div <%= if @status = 'success'; "class='ok'"; end %>> some message here </div> 

要么

 <% if @status == 'success' %> <div class='success'> <% else %> <div> <% end %> some message here </div> 

我不喜欢第一种方法,因为它看起来很拥挤,很难阅读。 我不喜欢第二种方法,因为嵌套是搞砸了。 把它放在模型中(像@status.css_class )是很好的,但是那不属于这个。 大多数人做什么?

我使用第一种方法,但使用稍微简洁的语法:

 <div class="<%= 'ok' if @status == 'success' %>"> 

虽然通常你应该用boolean true或数字loggingID来代表成功,而用布尔值falsenil来代表失败。 这样你就可以testing你的variables:

 <div class="<%= 'ok' if @success %>"> 

如果要在两个类之间进行select,则使用三元?:运算符的第二个表单很有用:

 <div class="<%= @success ? 'good' : 'bad' %>"> 

最后,您可以使用Rail的logging标记助手 (如div_for ,它会根据您提供的logging自动设置您的ID和类。 给定一个ID为47的人:

 # <div id="person_47" class="person good"> <% div_for @person, class: (@success ? 'good' : 'bad') do %> <% end %> 

避免视图中的逻辑

标准方法的问题在于它需要在视图中以if语句或三元forms的逻辑。 如果您有多个条件CSS类与默认类混合,则需要将该逻辑放入string插值或ERB标记中。

这是一个更新的方法,避免把任何逻辑放入视图中:

 <div class="<%= class_string(ok: @success) %>"> some message here </div> 

class_string方法

class_string帮助器使用由CSS类名称string布尔值组成的键/值对进行散列。 该方法的结果是一个布尔值计算为true的类的string。

样例用法

 class_names(foo: true, bar: false, baz: some_truthy_variable) # => "foo baz" 

其他用例

这个帮助器可以在ERB标签中使用,也可以在Rails帮助器(如link_to

 <div class="<%= class_string(ok: @success) %>"> some message here </div> <% div_for @person, class: class_string(ok: @success) do %> <% end %> <% link_to "Hello", root_path, class: class_string(ok: @success) do %> <% end %> 

要么/或类

对于需要使用三元组的情况(例如@success ? 'good' : 'bad' ),传递一个数组,其中第一个元素是类为true ,另一个为false

 <div class="<%= [:good, :bad] => @success %>"> 

灵感来自React

这个技术的灵感来自Facebook的React前端框架中的classNames (以前称为classSet )。

在你的Rails项目中使用

截至目前,Rails中不存在class_names函数,但是本文向您展示了如何将其添加或实现到您的项目中。

你也可以使用content_for助手,特别是如果DOM位于一个布局,你想设置的CSS类取决于部分加载。

在布局上:

 %div{class: content_for?(:css_class) ? yield(:css_class) : ''} 

在部分:

 - content_for :css_class do my_specific_class 

这就对了。