条件に基づいてクラスを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>
私は最初のアプローチが好きではありません。見た目が混雑していて読みにくいからです。ネストがめちゃくちゃになっているため、2番目のアプローチは好きではありません。モデルに入れておくといいでしょう(@status.css_class
)、しかし、それはそこに属していません。ほとんどの人は何をしますか?
私は最初の方法を使用しますが、少し簡潔な構文を使用します。
<div class="<%= 'ok' if @status == 'success' %>">
通常、ブールtrue
または数値レコードIDで成功を表し、ブールfalse
またはnil
で失敗を表す必要があります。この方法で、変数をテストできます。
<div class="<%= 'ok' if @success %>">
3つの?:
演算子を使用する2番目のフォームは、2つのクラスから選択する場合に便利です。
<div class="<%= @success ? 'good' : 'bad' %>">
最後に、div_for
などのRailの レコードタグヘルパー を使用できます。これにより、指定したレコードに基づいてIDとクラスが自動的に設定されます。 ID 47のPerson
を指定すると:
# <div id="person_47" class="person good">
<% div_for @person, class: (@success ? 'good' : 'bad') do %>
<% end %>
標準的なアプローチの問題は、ビューにif
ステートメントまたは3項の形式のロジックが必要なことです。複数の条件付きCSSクラスとデフォルトクラスが混在している場合、そのロジックを文字列補間またはERBタグに配置する必要があります。
ビューにロジックを追加することを回避する更新されたアプローチを次に示します。
<div class="<%= class_string(ok: @success) %>">
some message here
</div>
class_string
方法class_string
ヘルパーは、CSSクラス名文字列およびboolean値。メソッドの結果は、ブール値がtrueと評価されたクラスの文字列です。
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 %>
3進数が必要なユースケース(例:@success ? 'good' : 'bad'
)、最初の要素がtrue
のクラスで、もう1つの要素がfalse
のクラスである配列を渡します
<div class="<%= [:good, :bad] => @success %>">
この手法は、FacebookのclassNames
フロントエンドフレームワークのclassSet
(以前はReact
として知られていました)というアドオンに触発されています。
現在のところ、class_names
関数はRailsには存在しませんが、 この記事 は、プロジェクトに関数を追加または実装する方法を示しています。
Content_forヘルパーを使用することもできます。特に、DOMがレイアウト内にあり、ロードされた部分に応じてcssクラスを設定する場合。
レイアウト上:
%div{class: content_for?(:css_class) ? yield(:css_class) : ''}
部分的に:
- content_for :css_class do
my_specific_class
それだ。