Rails บางส่วนมีมานานหลายปีแล้ว แต่มันอาจจะดูเทอะทะได้เนื่องจากเป็นเพียงตัวอย่างข้อมูล ERB ที่ไม่มีโครงสร้างอ็อบเจ็กต์สำรอง
เมื่อเร็ว ๆ นี้ไลบรารีเช่น ViewComponent และ Phlex ได้พยายามปรับปรุงเลเยอร์มุมมองโดยการเพิ่มโครงสร้างความหมายให้กับเทมเพลต เหล่านี้เป็นห้องสมุดที่ยอดเยี่ยมและฉันเข้าถึงโดยส่วนตัวแล้วสำหรับ ViewComponent ในเกือบทุกโครงการที่ฉันทำ อย่างไรก็ตาม ฉันยังคงรู้สึกว่า Rails บางส่วนยังคงใช้งานได้ดีสำหรับการใช้งานหลายๆ กรณี
ทีมงาน Rails พยายามปรับปรุงข้อเสนออยู่เสมอ ดังนั้นเรามาดูฟีเจอร์ใหม่ที่เปิดตัวใน Rails 7.1:คนในพื้นที่ที่เข้มงวด!
รางบางส่วนและตัวแปรท้องถิ่น
เราสามารถส่งตัวแปรท้องถิ่นตามอำเภอใจไปยัง Rails บางส่วนได้ และพวกมันก็พร้อมใช้งานอย่างน่าอัศจรรย์
สิ่งนี้ไม่เหมาะ เนื่องจากเป็นเรื่องยากที่จะตรวจสอบให้แน่ใจว่าตัวแปรใดที่บางส่วนยอมรับหากมีมาร์กอัปบล็อกขนาดใหญ่ นอกจากนี้ เนื่องจากตัวแปรถูกสร้างขึ้นแบบไดนามิก ตัวแปรที่หายไปจะไม่ส่งคืน nil แต่จะทำให้เกิดข้อผิดพลาด
สมมติว่า icon เป็นทางเลือกในบางส่วนด้านบน:
เราแสดงผลเป็น:
นั่นจะเพิ่ม ActionView::Template::Error โดยมีข้อความ undefined local variable or method 'icon' for #<ActionView::Base:0x00000000023078> .
ความจริงที่ว่า icon เป็นทางเลือกที่ไม่ชัดเจนสำหรับผู้อ่านเช่นกัน จนถึง Rails 7.1 วิธีแก้ไขคือตรวจสอบ local_assigns แฮชซึ่งมีตัวแปรท้องถิ่นที่ถูกฉีดทั้งหมด
วิธีนี้แก้ไขข้อผิดพลาดข้างต้นเนื่องจาก icon ตัวแปรจะถูกตั้งค่าไว้เสมอ
Rails 7.1 พยายามแก้ไขข้อบกพร่องของตัวแปรท้องถิ่นในบางส่วนด้วยแนวคิด ท้องถิ่นที่เข้มงวด .
คนในพื้นที่ที่เข้มงวดใน Rails คืออะไร
เริ่มต้นใน Rails 7.1 เราสามารถเขียนความคิดเห็นวิเศษที่ด้านบนของ Partials ซึ่งกำหนดตัวแปรท้องถิ่นที่ยอมรับและค่าเริ่มต้นใดๆ สำหรับตัวแปรเหล่านั้น
Rails แยกวิเคราะห์ความคิดเห็นนี้และตั้งค่าตัวแปรที่กำหนดไว้ในบางส่วน ตอนนี้มันชัดเจนสำหรับผู้อ่านว่าตัวแปรใดที่ยอมรับบางส่วนและค่าเริ่มต้นใด ๆ
บางส่วนควรยังคงแสดงผลตามที่แสดงด้านบน ลองยกเว้น title ตัวแปรจากไซต์การโทรและดูว่าเกิดอะไรขึ้น:
คุณได้รับ ArgumentError พร้อมข้อความ missing local: :title :ข้อความแสดงข้อผิดพลาดที่สื่อความหมายมากขึ้นกว่าเดิม!
เมื่อใดจึงควรใช้คนในพื้นที่ที่เข้มงวด
คนในพื้นที่ที่เข้มงวดอาจเที่ยวยุ่งวุ่นวายได้ ดังนั้นจึงไม่ใช่ความคิดที่ดีที่จะใช้สิ่งเหล่านี้ โดยเฉพาะในแอปรุ่นเก่า
มาดูกรณีการใช้งานที่เหมาะสำหรับคนในพื้นที่ที่เข้มงวดกันดีกว่า สมมติว่าเรามีบางส่วนที่แสดงรายละเอียดของผู้ใช้ในการ์ด แต่มีเพียงผู้ดูแลระบบเท่านั้นที่สามารถเห็นเมื่อพวกเขาลงชื่อเข้าใช้ครั้งล่าสุด:
บางส่วนนี้ต้องใช้ตัวแปรหลายตัวและมีตัวแปรทางเลือก ทำให้เป็นกรณีที่สมบูรณ์แบบสำหรับคนในท้องถิ่นที่เข้มงวด การเพิ่มความคิดเห็นมหัศจรรย์ต่อไปนี้ลงในไฟล์ทำให้ง่ายต่อการอ่านแบบผ่านๆ:
ในกรณีของโมเดลที่เชื่อมโยงบางส่วน (เช่น posts/_post.html.erb ) เห็นได้ชัดว่าบางส่วนดังกล่าวยอมรับ post เดียว ตัวแปร ฉันไม่คิดว่าคนในพื้นที่ที่เข้มงวดไม่จำเป็นต้องเป็นความคิดที่ดีสำหรับกรณีเหล่านี้
Gotchas เจ้าถิ่นที่เข้มงวด
มี gotcha สองสามอย่างที่ต้องระวัง ซึ่งเป็นเหตุผลว่าทำไมฉันไม่แนะนำให้ใช้คนในพื้นที่ที่เข้มงวดทั่วกระดาน
การแสดงผลคอลเล็กชันโดยปริยาย
เมื่อเรนเดอร์คอลเลกชันโดยปริยาย:
Rails แทรก _post บางส่วนโดยมีตัวแปรสองตัวนอกเหนือจาก post ตัวแปร ก่อน Rails 7.1.2 จำเป็นต้องกำหนดสิ่งเหล่านี้ด้วยตนเองเพื่อป้องกันข้อผิดพลาด:
ปัญหานี้ได้รับการแก้ไขแล้วใน Rails 7.1.2 และตอนนี้ตัวแปรเหล่านี้เป็นทางเลือก (แต่ควรรู้ว่ามีอยู่หากจำเป็น)!
การออกอากาศผ่าน ActionCable
เมื่อออกอากาศบางส่วนผ่าน ActionCable จากการโทรกลับ ActiveRecord:
คุณต้องระบุ request_id ตัวแปรท้องถิ่นเริ่มต้นที่ nil เนื่องจาก Rails ใช้ภายใต้ประทุน
การไม่ทำเช่นนั้นจะส่งผลให้เกิดข้อผิดพลาดเมื่อมีการเรียกกลับ
และนั่นคือการทัวร์หยุดนกหวีดของเราเสร็จสิ้น!
บางสิ่งที่ควรคำนึงถึง
การเพิ่มคำท้องถิ่นที่เข้มงวดลงในบางส่วนที่มีอยู่ถือเป็นทั้งหมดหรือไม่มีเลย ข้อเสนอสำหรับไฟล์ที่กำหนด เราไม่สามารถเพิ่มตัวแปรทีละน้อยให้กับความคิดเห็นมหัศจรรย์เมื่อเราพบพวกมันได้ ดังที่แสดงใน gotcha ข้างต้น อาจเป็นเรื่องยากที่จะตรวจสอบตัวแปรทั้งหมดที่จำเป็นต้องประกาศในความคิดเห็นมหัศจรรย์
เมื่อพิจารณาว่าการให้เหตุผลเกี่ยวกับโค้ดกับคนในท้องถิ่นที่เข้มงวดนั้นง่ายกว่ามาก ฉันคิดว่าพวกเขาคุ้มค่าที่จะใช้อย่างกว้างขวางในแอพใหม่ (และเพิ่มผลย้อนหลังให้กับแอพรุ่นเก่าอย่างต่อเนื่อง)
สิ่งสำคัญคือต้องแน่ใจว่าชุดการทดสอบของคุณในแอปรุ่นเก่าครอบคลุมบางส่วนที่คุณเพิ่มคนในพื้นที่ที่เข้มงวด การละเว้นจะทำให้เกิดข้อยกเว้น ดังนั้นคุณต้องแน่ใจว่าคุณได้ทดสอบกรณีการใช้งานทั้งหมดก่อนที่จะปรับใช้การเปลี่ยนแปลง
แม้ว่าฉันจะไม่ใช่แฟนตัวยงของความคิดเห็นมหัศจรรย์ก็ตาม (เนื่องจากฉันเชื่อว่าความคิดเห็นไม่ควรมีฟังก์ชันการทำงาน) ฉันคิดว่าคนในพื้นที่ที่เข้มงวดเป็นส่วนเสริมที่ยอดเยี่ยมของ Rails เป็นเรื่องยุ่งยากมาโดยตลอดที่จะมอบหมายให้คนในพื้นที่บางส่วนและสิ่งเหล่านี้จะทำให้ง่ายขึ้น เพียงระวัง gotchas!
สรุป
ในโพสต์นี้ เราได้ดูคร่าวๆ เกี่ยวกับคนในพื้นที่ที่เข้มงวดใน Rails 7.1 เราได้เห็นแล้วว่าตัวแปรบางส่วนและตัวแปรท้องถิ่นทำงานอย่างไร ก่อนที่จะพิจารณาว่าเมื่อใดควรใช้ตัวแปรท้องถิ่นที่เข้มงวดและ gotcha บางส่วน
ขอให้สนุกกับการเขียนโค้ด!
ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว! ป>
อายัช นิวาเทีย
ผู้เขียนรับเชิญ Ayush เป็นนักพัฒนา Ruby และ Rails อิสระ เขาเป็นผู้เขียน The Rails และ Hotwire Codex และเป็นส่วนหนึ่งของทีมงานหลักของ Bridgetown นอกจากนี้เขายังเรียกใช้แอปรายชื่ออีเมลที่เน้นความเป็นส่วนตัวที่เรียกว่า Scattergun
บทความทั้งหมดโดย Ayush Newatia