有条件地向视图中的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来代表成功,而用布尔值false或nil来代表失败。 这样你就可以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 
这就对了。