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

จัดเก็บสถานะ Ephemeral UI ใน Rails ได้อย่างง่ายดายด้วย Kredis

Kredis (Keyed Redis) เป็นส่วนเสริมล่าสุดของชุดเครื่องมือของผู้พัฒนา Rails มุ่งมั่นที่จะลดความซับซ้อนในการจัดเก็บและการเข้าถึงข้อมูลที่มีโครงสร้างบน Redis

ในส่วนแรกของซีรีส์สองตอนนี้ เราจะเริ่มต้นด้วยการเข้าไปดูว่า Kredis ทำงานอย่างไร จากนั้นเราจะเรียกใช้กรณีการใช้งานตัวอย่างสำหรับการจัดเก็บสถานะ UI ชั่วคราวโดยใช้คีย์ Redis ที่ออกแบบเป็นพิเศษ

มาเริ่มกันเลย!

บทนำเกี่ยวกับ Kredis สำหรับ Rails

Kredis คือ Railtie ที่ให้กระดาษห่อที่สะดวกเพื่อปรับปรุงการใช้งานในสามวิธี:

  • API รูปแบบ Ruby :ตัวอย่างเช่น ประเภทคอลเลกชัน เช่น 00 หรือ 19 จำลองประเภท Ruby ดั้งเดิม (และ API ที่เกี่ยวข้อง) ให้มากที่สุด
  • การพิมพ์ :สะดวกเป็นพิเศษสำหรับคอลเลกชัน Kredis สามารถรองรับการพิมพ์องค์ประกอบจาก/ไปยังประเภทข้อมูลมาตรฐาน (เช่น 28 , 32 ).
  • ActiveRecord DSL :อาจเป็นทรัพย์สินที่ใหญ่ที่สุดของไลบรารี ซึ่งช่วยให้คุณเชื่อมต่อโครงสร้างข้อมูล Redis ใดๆ กับ อินสแตนซ์โมเดลเฉพาะ ได้อย่างง่ายดาย .

นี่คือตัวอย่างจาก README:

 

ประโยชน์หลักของ Kredis คือความสะดวกในการจัดเก็บข้อมูลชั่วคราวที่เกี่ยวข้องกับบันทึกบางอย่าง แต่ ไม่ขึ้นกับเซสชัน . โดยทั่วไป เมื่อคุณต้องการคงข้อมูลไว้ใน Rails คุณจะมีตัวเลือก 2-3 ตัวเลือก ซึ่งตัวเลือกที่พบบ่อยที่สุด 2 รายการคือ:

  • แอคทีฟเรคคอร์ด :ในกรณีส่วนใหญ่ จะต้องเพิ่มคอลัมน์หรือแพตช์โมเดลข้อมูลของคุณ จำเป็นต้องมีการย้ายข้อมูล รวมถึงการทดแทนบันทึกเก่าที่เป็นทางเลือก
  • เซสชัน :ที่เก็บคีย์/ค่าเริ่มต้นของแอป Rails ทุกแอป และไม่จำเป็นต้องตั้งค่าหรือตั้งค่าเพียงเล็กน้อย ข้อเสียคือข้อมูลที่เก็บไว้ในนั้นไม่สามารถผ่านรอบการเข้าสู่ระบบ/ออกจากระบบได้

เครดิสนำทางเลือกที่สามมาไว้บนโต๊ะ จำเป็นต้องมีการตั้งค่าเพียงเล็กน้อย นอกเหนือจากการเรียกใช้ DSL ในโมเดล แต่เว้นแต่อินสแตนซ์ Redis ของคุณจะหยุดทำงาน ข้อมูลของคุณจะถูกจัดเก็บไว้ในเซสชันต่างๆ และแม้แต่อุปกรณ์ต่างๆ กรณีการใช้งานที่ดีสำหรับ Kredis ก็คือข้อมูลที่ไม่สำคัญที่คุณต้องการแชร์ข้ามขอบเขตอุปกรณ์ เช่น ในเว็บแอปและแอปมือถือที่แสดงร่วมกัน

กรณีศึกษา:คงอยู่และกู้คืนสถานะ UI ที่ยุบ/ขยายโดยใช้ Kredis

ตัวอย่างการใช้งานที่ดีสำหรับ Kredis โดยทั่วไปคือเมื่อคงสถานะ UI ไว้ เช่น:

  • สถานะเปิด/ปิดแถบด้านข้าง
  • สถานะเปิด/ปิดมุมมองแบบต้นไม้
  • สถานะยุบ/ขยายของหีบเพลง
  • รูปแบบแดชบอร์ดที่กำหนดเอง
  • ตารางข้อมูลที่จะแสดงมีกี่บรรทัด

ตัวอย่าง เราจะดูวิธีจัดการสถานะการยุบ/ขยายของ 41 องค์ประกอบ.

มาเริ่มกันด้วยแอป Rails ใหม่ เพิ่ม 55 ไปยังบันเดิล และรันโปรแกรมติดตั้ง:

 

หมายเหตุ: สิ่งนี้จะสร้างไฟล์การกำหนดค่า Redis ใน 60 .

สำหรับส่วนที่เหลือของบทความนี้ ฉันจะถือว่าคุณมีอินสแตนซ์ Redis ที่ทำงานอยู่ในเครื่อง บน macOS ที่มี Homebrew การดำเนินการนี้ทำได้ง่ายพอๆ กับการรัน:

 

โปรดอ่านคู่มือ "เริ่มต้นใช้งาน" อย่างเป็นทางการเพื่อดูข้อมูลเกี่ยวกับวิธีการติดตั้ง Redis บนระบบปฏิบัติการของคุณ

การตรวจสอบสิทธิ์ผู้ใช้

เราจะใช้ 74 โมเดลเป็นเอนทิตีในการจัดเก็บข้อมูลสถานะ UI เพื่อหลีกเลี่ยงการปั่นจักรยานที่นี่ ให้ใช้สิ่งที่ Devise มอบให้ทันที:

 

จากนั้นเราสร้างผู้ใช้ตัวอย่างในคอนโซล Rails:

 

แอปตัวอย่างของเรา:ร้านค้าออนไลน์

เพื่อแสดงให้เห็นว่า Kredis สามารถช่วยรักษาสถานะของโครงสร้างต้นไม้ที่ซับซ้อนได้อย่างไร สมมติว่าเรากำลังเปิดห้างสรรพสินค้าออนไลน์ ด้วยเหตุนี้ เราจะนั่งร้าน 85 และ 95 โมเดล เรารวมการรวมด้วยตนเองจากแผนกหนึ่งไปอีกแผนกหนึ่ง เพื่อสร้างโครงสร้างที่ซ้อนกันสองระดับ:

 

แน่นอนว่าเราต้องอนุญาตให้พาเรนต์ที่เป็นโมฆะเพื่ออนุญาตรากโครงสร้างต้นไม้ของเรา:

 

107 ของเรา และ 118 โมเดลถูกกำหนดไว้ดังนี้:

 

สุดท้ายนี้ เราใช้ faker เพื่อสร้างข้อมูลเริ่มต้น:

 

นั่งร้านหน้าร้าน

เราจะสร้าง 120 แบบง่ายๆ ที่จะทำหน้าที่เป็นหน้าร้านของร้านเรา

 

เราดำเนินการรวมตนเองกับลูกหลานของแผนกเพื่อดึงเฉพาะแผนกที่มีแผนกย่อยจริงๆ (หรืออีกนัยหนึ่งคือเป็นรากฐานของแผนภูมิต้นไม้ของเรา):

 

ในมุมมองดัชนี เราตั้งค่ามุมมองแบบต้นไม้แบบซ้อนโดยใช้ 135 สองระดับ องค์ประกอบสำหรับแผนกของเรา:

 

ตอนนี้เรามีมุมมองแบบต้นไม้ของแผนกต่างๆ ที่มีชื่อผลิตภัณฑ์โง่ๆ โดยเจตนา ซึ่งเราสามารถสำรวจได้โดยการเปิดและปิด:

จัดเก็บสถานะ Ephemeral UI ใน Rails ได้อย่างง่ายดายด้วย Kredis

เราต้องการคงสถานะการเปิดเผยข้อมูลของแต่ละหมวดหมู่ต่อไป ซึ่งเราจะดำเนินการต่อไป

สถานะ UI ของหมวดหมู่ที่มีอยู่ใน Kredis

นี่คือสิ่งที่เรากำลังจะทำ ทีละขั้นตอน:

  1. เพิ่ม 145 เรียกว่า 157 ไปที่ 169 โมเดล เหตุผลที่เราใช้ชุดที่นี่คือไม่อนุญาตให้ทำซ้ำ ดังนั้นเราจึงสามารถเพิ่มและลบแผนกของเราได้อย่างปลอดภัย

  2. สร้าง 178 ที่จะได้รับพารามิเตอร์ต่อไปนี้:

    • 183
    • 196 สถานะของแผนกนั้น

    จากนั้นจะเพิ่มหรือลบแผนกนี้ไปที่ 200 สำหรับผู้ใช้ที่เข้าสู่ระบบอยู่ในปัจจุบัน

  3. สร้างตัวควบคุมการกระตุ้น ซึ่งจะรับฟังเหตุการณ์สลับในองค์ประกอบรายละเอียดและส่งผ่านเพย์โหลดที่เกี่ยวข้อง

เข้าเรื่องเลย!

การเพิ่มโครงสร้างข้อมูล Kredis ดังกล่าวใน 214 model นั้นง่ายเหมือนกับการเรียก 227 และส่งผ่านตัวระบุ:

 

ต่อไป เราจะสร้าง 236 เพื่อรับการอัพเดตสถานะ UI โปรดทราบว่าเราต้องกำหนดค่าเส้นทางที่สร้างขึ้นให้เป็น 244 จุดสิ้นสุด:

 
 

การเผชิญหน้าครั้งแรกกับ API ของ Kredis อยู่ในคอนโทรลเลอร์ เราจะเห็นว่ามันพยายามที่จะสอดคล้องกับความคาดหวังของนักพัฒนา Ruby อย่างใกล้ชิดที่สุดเท่าที่จะเป็นไปได้ ดังนั้นคุณจึงสามารถเพิ่มลงในชุดได้โดยใช้ 250 และลบโดยใช้ 262 .

 

สิ่งที่เกิดขึ้นที่นี่คือเราสลับการแสดง 272 ที่เฉพาะเจาะจง ในชุดตาม 282 พารามิเตอร์ถูกส่งมอบจากลูกค้า เพื่อให้ภาพสมบูรณ์ เราต้องเขียนโค้ดฝั่งไคลเอ็นต์เพื่อส่งการเปลี่ยนแปลงสถานะ UI เหล่านี้

เราจะใช้ 293 เพื่อดำเนินการ ดังนั้นเราจึงต้องปักหมุด:

 

ในตัวควบคุม Stimulus ใหม่ที่เราจะแนบไปกับ 300 เฉพาะ องค์ประกอบ เราจะผนวก ID แผนกและ 319 ระบุเป็น 320 คัดค้าน และส่ง:

 

เราแก้ไขโค้ดการดูของเราตามที่เสนอ และรับฟัง 336 เหตุการณ์ของแต่ละ 348 องค์ประกอบที่จะทริกเกอร์การอัปเดตสถานะ UI:

 

เติมน้ำ DOM ด้วยตนเอง

ส่วนประกอบเดียวที่ขาดหายไปในการเติมเต็มคือการให้ความชุ่มชื้น DOM ของเราไปสู่สถานะที่ต้องการเมื่อผู้ใช้รีเฟรชเพจ เราดำเนินการด้วยตนเองโดยเพิ่ม 358 แอตทริบิวต์เป็น 361 โหนด (หากมี ID แผนกอยู่ในชุด Kredis):

 

สุดท้ายนี่คือผลลัพธ์ โปรดทราบว่าสถานะเปิด/ปิดของโหนดต้นไม้แต่ละโหนดจะถูกรักษาไว้มากกว่า 2 ระดับ:

ถัดไป:คอนเทนเนอร์ภายในของผู้ใช้ทั่วไปสำหรับสถานะ UI

ในส่วนแรกของซีรีส์สองตอนนี้ เราได้แนะนำ Kredis และสำรวจวิธีการคงอยู่และกู้คืนสถานะ UI ที่ยุบ/ขยายด้วย Kredis

เราใช้ตัวอย่างของห้างสรรพสินค้าออนไลน์เพื่อเน้นย้ำว่า Kredis สามารถรักษาสถานะของโครงสร้างต้นไม้ที่ซับซ้อนได้อย่างไร ก่อนที่จะเติมน้ำให้กับ DOM ด้วยตนเองในที่สุด

อย่างไรก็ตาม นี่หมายความว่าเราต้องประดิษฐ์คีย์ Kredis จำนวนมาก คราวหน้า เราจะมาเจาะลึกถึงวิธีที่เราจะจัดการเรื่องนี้ด้วยคอนเทนเนอร์ภายในเครื่องของผู้ใช้ทั่วไปสำหรับสถานะ UI

ถึงเวลานั้น ขอให้สนุกกับการเขียนโค้ด!

ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว!