Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

Ruby on Rails 7.1: เชี่ยวชาญ Strict Local Variables ใน Partials

Rails partials มานานหลายปีแล้ว แต่มันอาจ笨重 เพราะมันแค่ ERB snippets โดยไม่มี backing object structure

เมื่อเร็วๆ นี้ ไลบรารีอย่าง ViewComponent และ Phlex ได้พยายามปรับปรุง view layer โดยการเพิ่ม semantic structure ให้ templates นี่คือไลบรารีที่ยอดเยี่ยม และผมเองใช้ ViewComponent ในเกือบทุกโปรเจกต์ที่ผมทำงาน อย่างไรก็ตาม ผมยังรู้สึกว่า Rails partial เหมือนเดิมยังทำงานได้ดีสำหรับ use cases หลายอย่าง

ทีม Rails พยายามปรับปรุงการเสนอของพวกเขาเสมอ ดังนั้นมาดูฟีเจอร์ใหม่ที่นำเสนอใน Rails 7.1: strict locals!

Rails Partials และ Local Variables

เราสามารถส่ง local variables 神經质ไปยัง Rails partials และพวกมันจะพร้อมใช้งานด้วยวิธีลึกลับ



สิ่งนี้ไม่เหมาะสม เพราะมันยากที่จะ确定ว่า partial ยอมรับ variables อะไรบ้าง หากมี markup block ใหญ่ นอกจากนี้ เนื่องจาก variables ถูกสร้างแบบ dynamic variable ที่หายไปจะไม่คืนค่า nil แต่จะทำให้เกิด error

สมมติว่า icon เป็น optional ใน partial ด้านบน:



เรา render มันเป็น:



นี่จะ raise ActionView::Template::Error พร้อมข้อความ undefined local variable or method 'icon' for #<ActionView::Base:0x00000000023078>

ข้อเท็จจริงที่ว่า icon เป็น optional ไม่ชัดเจนสำหรับผู้อ่านเช่นกัน จนถึง Rails 7.1 วิธีแก้คือการ inspect local_assigns hash ซึ่งมี local variables ที่ inject ทั้งหมด



สิ่งนี้แก้ error ข้างบน เพราะตัวแปร icon ตอนนี้ถูกตั้งค่ามาเสมอ

Rails 7.1 พยายามแก้ไขข้อบกพร่องของ local variables ใน partials ด้วยแนวคิด strict locals

Strict Locals ใน Rails คืออะไร?

เริ่มต้นใน Rails 7.1 เราสามารถเขียน magic comment ที่ด้านบนของ partials ซึ่งกำหนด local variables ที่มันยอมรับและค่า default ใดๆ สำหรับพวกมัน



Rails parse comment นี้และตั้งค่าตัวแปรที่กำหนดใน partial ตอนนี้ชัดเจนอย่างชัดเจนสำหรับผู้อ่านว่า partial ยอมรับ variables อะไรและค่า default ใดๆ

Partial ควรยัง render ตามที่แสดงข้างบน ลอง exclude ตัวแปร title จาก call site และดูว่าจะเกิดอะไรขึ้น:



คุณจะได้ ArgumentError พร้อมข้อความ missing local: :title: error message ที่ descriptive กว่าก่อนหน้า!

เมื่อไหร่ควรใช้ Strict Locals

Strict locals อาจ tricky ดังนั้นไม่ใช่เสมอไปที่เป็นความคิดดีที่จะใช้พวกมัน โดยเฉพาะใน legacy apps

มาใช้ use case ที่สมบูรณ์แบบสำหรับ strict locals สมมติว่าเรามี partial แสดงรายละเอียด user ใน card แต่เฉพาะ admins เท่านั้นที่เห็นว่าเขาล็อกอินล่าสุดเมื่อไหร่:



Partial นี้รับ variables หลายตัว และมี optional variable ทำให้เป็น case ที่สมบูรณ์แบบสำหรับ strict locals การเพิ่ม magic comment ต่อไปนี้ลงในไฟล์ทำให้มันง่ายขึ้นอย่างมากในการ skim:



ในกรณีของ associated partial ของ model (เช่น posts/_post.html.erb) มันค่อนข้างชัดเจนว่ partial เหล่านี้ยอมรับ single post variable ผมไม่คิดว่า strict locals จำเป็นสำหรับกรณีเหล่านี้

Strict Locals Gotchas (ข้อระวัง)

มี gotchas สองประการที่ต้องระวัง ซึ่งเป็นเหตุผลที่ผมไม่แนะนำให้ใช้ strict locals ทั่วทั้งโปรเจกต์

Implicitly Rendering a Collection

เมื่อ implicitly rendering a collection:



Rails inject _post partial ด้วยสองตัวแปรนอกจากตัวแปร post ก่อน Rails 7.1.2 ตัวแปรเหล่านี้ต้องถูกกำหนดด้วยตนเองเพื่อป้องกัน error:



ปัญหานี้ถูกแก้ไขใน Rails 7.1.2 และตัวแปรเหล่านี้ตอนนี้ optional แล้ว (แต่ดีที่จะรู้ว่ามันมีอยู่หากต้องการ)!

Broadcasting Over ActionCable

เมื่อ broadcasting partial ผ่าน ActionCable จาก ActiveRecord callback:



คุณต้องระบุ local variable request_id ที่ default เป็น nil เนื่องจากมันถูกใช้ภายใต้ฝาครอบโดย Rails



ไม่ทำเช่นนั้นจะทำให้เกิด error เมื่อ callback ถูกกระตุ้น

และนั่นคือ whistle-stop tour ของเราเสร็จแล้ว!

สักข้อที่ควรจดจำ

การเพิ่ม strict locals ให้ partials ที่มีอยู่เป็นข้อเสนอ all-or-nothing สำหรับไฟล์ที่กำหนด เราไม่สามารถเพิ่ม variables ให้ magic comment แบบ incremental ได้เมื่อเราพบพวกมัน ตามที่แสดงใน gotchas ข้างต้น มันอาจ tricky ที่จะ確定 all variables ที่ต้องประกาศใน magic comment

โดยคำนึงถึงว่ามันทำให้ reasoning เกี่ยวกับโค้ดง่ายขึ้นมากด้วย strict locals ผมคิดว่ามัน worth using extensively ใน new apps (และเพิ่ม retroactively อย่างค่อยเป็นค่อยไปใน legacy apps)

สำคัญที่จะต้องแน่ใจว่า test suite ใน legacy apps ครอบคลุม partials ที่คุณเพิ่ม strict locals การละเลยจะทำให้เกิด exception ดังนั้นคุณต้องแน่ใจว่าคุณทดสอบ all use cases ก่อน deploy การเปลี่ยนแปลง

แม้ผมจะไม่ใช่แฟนใหญ่ของแนวทาง magic comment (เพราะผมเชื่อว่า comments ไม่ควรมี functionality) ผมคิดว่า strict locals เป็นการเพิ่มที่ยอดเยี่ยมให้ Rails มันเคย tricky ในการ assign locals ให้ partial และเหล่านี้ทำให้มันง่ายขึ้น เพียงระวัง gotchas!

สรุป

ในโพสต์นี้ เราดู strict locals ใน Rails 7.1 แบบรวดเร็ว เราเห็นว่า partials และ local variables ทำงานอย่างไรก่อน 探索เมื่อไหร่ควรใช้ strict locals และ gotchas บางอย่าง

Happy coding!

P.S. หากคุณอยากอ่าน Ruby Magic posts ทันทีที่พวกเขาออก ให้ subscribe Ruby Magic newsletter ของเรา และไม่เคยพลาดโพสต์เดี่ยว!

Ruby on Rails 7.1: เชี่ยวชาญ Strict Local Variables ใน Partials
Ayush Newatia

Ayush Newatia

Guest author Ayush เป็น freelance Ruby และ Rails developer เขาคือผู้เขียนของ The Rails and Hotwire Codex และส่วนหนึ่งของ Bridgetown core team เขายังรัน privacy focused mailing list app ที่ชื่อ Scattergun

บทความทั้งหมดโดย Ayush Newatia