Tránh logic trong các khung nhìn
Vấn đề với cách tiếp cận tiêu chuẩn là nó yêu cầu logic ở dạng các if
câu lệnh hoặc các cụm từ trong khung nhìn. Nếu bạn có nhiều lớp CSS có điều kiện được trộn lẫn với các lớp mặc định, thì bạn cần đặt logic đó vào nội suy chuỗi hoặc thẻ ERB.
Đây là một cách tiếp cận được cập nhật để tránh đặt bất kỳ logic nào vào các chế độ xem:
<div class="<%= class_string(ok: @success) %>">
some message here
</div>
class_string
phương pháp
Trình class_string
trợ giúp lấy một hàm băm với các cặp khóa / giá trị bao gồm chuỗi tên lớp CSS và giá trị boolean . Kết quả của phương thức là một chuỗi các lớp trong đó giá trị boolean được đánh giá là true.
Sử dụng mẫu
class_names(foo: true, bar: false, baz: some_truthy_variable)
# => "foo baz"
Các trường hợp sử dụng khác
Trình trợ giúp này có thể được sử dụng trong ERB
các thẻ hoặc với trình trợ giúp Rails chẳng hạn 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 %>
Hoặc / Hoặc các lớp
Đối với các trường hợp sử dụng trong đó một bậc ba là cần thiết (ví dụ @success ? 'good' : 'bad'
), hãy chuyển một mảng trong đó phần tử đầu tiên là lớp cho true
và phần tử kia là chofalse
<div class="<%= [:good, :bad] => @success %>">
Lấy cảm hứng từ React
Kỹ thuật này được lấy cảm hứng từ một tiện ích bổ sung có tên classNames
(trước đây gọi là classSet
) từ React
khung giao diện người dùng của Facebook .
Sử dụng trong các dự án Rails của bạn
Hiện tại, class_names
hàm không tồn tại trong Rails, nhưng bài viết này hướng dẫn bạn cách thêm hoặc triển khai nó vào các dự án của mình.