หลีกเลี่ยงตรรกะในมุมมอง
ปัญหาเกี่ยวกับแนวทางมาตรฐานคือต้องใช้ตรรกะในรูปแบบของif
คำสั่งหรือเทอร์นารีในมุมมอง หากคุณมีคลาส CSS แบบมีเงื่อนไขหลายคลาสผสมกับคลาสเริ่มต้นคุณจะต้องใส่ตรรกะนั้นลงในการแก้ไขสตริงหรือแท็ก ERB
นี่คือแนวทางการปรับปรุงที่หลีกเลี่ยงการใส่ตรรกะใด ๆ ในมุมมอง:
<div class="<%= class_string(ok: @success) %>">
some message here
</div>
class_string
วิธี
class_string
ผู้ช่วยยิงแฮชคู่กับคีย์ / ค่าประกอบด้วยCSS สตริงชื่อชั้นและค่าบูลีน ผลลัพธ์ของเมธอดคือสตริงของคลาสที่ค่าบูลีนประเมินเป็นจริง
ตัวอย่างการใช้งาน
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 %>
อย่างใดอย่างหนึ่ง / หรือชั้นเรียน
สำหรับกรณีการใช้งานที่จำเป็นต้องใช้ ternary (เช่น@success ? 'good' : 'bad'
) ให้ส่งอาร์เรย์โดยที่องค์ประกอบแรกเป็นคลาสสำหรับtrue
และอีกอันใช้สำหรับfalse
<div class="<%= [:good, :bad] => @success %>">
แรงบันดาลใจจากปฏิกิริยา
เทคนิคนี้ได้รับแรงบันดาลใจจาก Add-on ที่เรียกว่าclassNames
(เดิมเรียกว่าclassSet
) จากReact
front-end framework ของ Facebook
ใช้ในโครงการ Rails ของคุณ
ณ ตอนนี้class_names
ฟังก์ชันนี้ไม่มีอยู่ใน Rails แต่บทความนี้จะแสดงวิธีเพิ่มหรือนำไปใช้ในโครงการของคุณ