有条件地向视图中的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
这就对了。