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

สร้างตัวแก้ไขตารางแบบไดนามิกใน Rails โดยใช้ Trix และ Turbo Frames

ในโพสต์นี้ เราจะใช้โปรแกรมแก้ไขตาราง ActionText พื้นฐานสำหรับแอปพลิเคชัน Rails ของคุณ เราจะเรียนรู้วิธีการ:

  • ไฟล์แนบ ActionText และ Trix จัดการ
  • เพื่อใช้ 04 ของเราเอง พิมพ์และใช้ประโยชน์จากสิ่งนี้เพื่อสร้างโปรแกรมแก้ไขตารางพื้นฐาน
  • Turbo Frames สามารถใช้เพื่อแก้ไขตารางได้
  • เทอร์โบช่วยและเข้าขวางในเวลาเดียวกัน

บทความนี้ได้รับแรงบันดาลใจจากโพสต์บนบล็อก 'การเพิ่มตารางใน ActionText ด้วย Stimulus.js' ที่ยอดเยี่ยมในปี 2020 ซึ่งเขียนขึ้นก่อนการถือกำเนิดของ Turbo ซึ่งเราคาดว่าจะทำให้เรื่องต่างๆ ง่ายขึ้นเล็กน้อย

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

สิ่งที่แนบมากับข้อความการกระทำใน Rails 101

หมายเหตุ :การสาธิตนี้ประกอบด้วยความเข้าใจเกี่ยวกับ Trix และ Turbo Frames คุณอาจพบว่าโพสต์ "เริ่มต้นใช้งาน Hotwire ในแอป Ruby on Rails" ของเรามีประโยชน์ในการเรียนรู้พื้นฐานของ Hotwire และ Turbo Frames

คุณสามารถปฏิบัติตามการสาธิตโค้ดด้วย repo GitHub นี้

ตามที่อธิบายไว้ในเอกสารประกอบ ActionText:

Action Text นำเนื้อหา Rich Text และการแก้ไขมาสู่ Rails ประกอบด้วยโปรแกรมแก้ไข Trix ที่จัดการทุกอย่างตั้งแต่การจัดรูปแบบ ลิงก์ เครื่องหมายคำพูด รายการ รูปภาพและแกลเลอรีที่ฝังไว้

ในระดับสูง ไฟล์แนบเป็นส่วนหนึ่งของโมเดลเอกสารของ ActionText พวกเขาแสดงเทมเพลตแบบกำหนดเองสำหรับทรัพยากรใด ๆ ที่สามารถแก้ไขได้ด้วย Signed Global ID (SGID) กล่าวอีกนัยหนึ่ง ActionText เก็บการอ้างอิงถึง SGID บางอย่างเป็น 18 องค์ประกอบ:

 

เมื่อใดก็ตามที่ ActionText พบองค์ประกอบดังกล่าว จะเรียก 22 วิธีการเกี่ยวกับทรัพยากรที่เกี่ยวข้อง ตามค่าเริ่มต้น วิธีการนี้จะมอบหมายให้ 34 .

ในการดูตัวอย่าง นี่คือวิธีที่ 43 ของเรา การแสดงของ ActionText ใน ActionText จะมีลักษณะเมื่อแสดงผลกลับไปเป็น HTML:

 

เพื่อให้สอดคล้องกับ ActionText Attachment API คลาสต้องทำสองสิ่งเท่านั้น:

  1. ใช้งาน 55 โดยใส่ 66 . ตามค่าเริ่มต้น ทั้งหมด 79 ผู้สืบทอดทำเช่นนี้แล้ว
  2. รวม 83 โมดูล.

93 โมดูลนำเสนอวิธีที่เป็นที่ยอมรับในการแปลงโมเดลใด ๆ เป็นและจาก SGID ผ่านทาง 105 และ 117 วิธีการ เราจะใช้สิ่งนี้ในภายหลัง

นอกจากนี้ยังให้ความสะดวกในการเข้าถึงข้อมูลเมตาของไฟล์แนบ เช่น ขนาดและชื่อไฟล์ ตลอดจนประเภทเนื้อหา

สุดท้ายนี้ จะจัดเตรียมตำแหน่งเริ่มต้นสำหรับบางส่วนที่ใช้เพื่อแสดงไฟล์แนบในโปรแกรมแก้ไขและมุมมอง Rich Text

การเพิ่มโมเดลตาราง

เราจะใช้ประโยชน์จาก Attachment API ของ ActionText เพื่อนำโซลูชันตารางของเราไปใช้ สำหรับสิ่งนี้ เราต้องสร้างโมเดลที่กำหนดเองเพื่อบันทึกข้อมูลตารางของเราและรวม 126 . เราจะใช้คอลัมน์ JSON(B) แบบธรรมดาเพื่อเก็บอาร์เรย์สองมิติสำหรับข้อมูลตาราง

เพื่อเริ่มต้นการสำรวจ เรามาสร้างแอป Rails ใหม่โดยเปิดใช้งาน ActionText:

 

เนื่องจากวันนี้ฉันรู้สึกไม่สร้างสรรค์ เรามาสร้าง 131 กันดีกว่า โมเดลที่มีชื่อเรื่องและเนื้อหาข้อความที่หลากหลาย:

 

ระวัง นี่คือ gotcha ที่น่าแปลกใจ! คำสั่งการติดตั้งข้างต้นสร้าง 144 การโยกย้าย ดังนั้นเราจึงต้องเปลี่ยนชื่อเป็น 158 . นอกจากนี้ เราจะกำหนดให้เป็นตาราง 2x2 โดยใช้ 162 .

 

เพิ่มตารางให้กับโมเดล Rails ActionText

ก่อนที่เราจะดำเนินการเพิ่มตารางให้กับ Rich Text เราจำเป็นต้องแพตช์แถบเครื่องมือของ Trix ก่อน:

 

ที่นี่ เราจะเพิ่มปุ่มต่อท้าย 175 ของ Trix ด้วยตนเอง . การเดินสายนี้จนถึง 184 ตัวควบคุมการกระตุ้น (ที่เรายังไม่ได้สร้าง) จะแทรกตารางลงในเอกสาร มาทำให้ปุ่มนี้มี SVG สวยๆ เป็นเนื้อหาใน CSS และตั้งค่าสไตล์ตารางบางส่วนในขณะที่เราทำสิ่งนี้:

 

อย่างที่คุณเห็น เราได้เพิ่มมันลงในกลุ่ม "เครื่องมือไฟล์" เรียบร้อยแล้ว:

สร้างตัวแก้ไขตารางแบบไดนามิกใน Rails โดยใช้ Trix และ Turbo Frames

ตอนนี้เรากลับมาที่การเพิ่มและจัดการตารางด้วยความช่วยเหลือของ Turbo สำหรับสิ่งนี้ เราจำเป็นต้องมีคอนโทรลเลอร์ที่มี 192 ก่อน การกระทำ:

 

การดำเนินการนี้สามารถยืมมาจากโพสต์บล็อก 'On Rails' ที่เราอ้างถึงในบทนำไม่มากก็น้อย สร้าง JSON ที่จำเป็นในการแทรกไฟล์แนบในฝั่งไคลเอ็นต์:รวมถึง SGID และ 208 แสดงผลจาก 210 บางส่วนดังที่เราจะได้เห็นในภายหลัง

 

เราเพิ่มเส้นทางตารางที่เป็นประโยชน์ที่เกี่ยวข้อง ไปยังการกำหนดค่าของเรา:

 

ตอนนี้ถึงเวลาที่จะต้องดำดิ่งลงไปสู่จุดลึกสุด:เราจำเป็นต้องสร้างโมเดลตารางของเรา ก่อนอื่น เรามารวม 220 กันก่อน และกำหนดเส้นทางบางส่วนที่เกี่ยวข้อง:

 

โปรดทราบว่าเรายังไม่ได้กำหนดวิธีการจัดเก็บเนื้อหาของตาราง เนื่องจากเราประกาศว่าเป็นคอลัมน์ JSON(B) ในฐานข้อมูลของเรา เราจึงมีอิสระในการเลือกรูปแบบใดก็ได้ เบี่ยงเบนไปจากโพสต์บล็อกที่อ้างถึงเล็กน้อย มาดูอาร์เรย์สองมิติกัน ดังนั้นเราจึงสามารถทำการวนซ้ำซ้อนบน 230 ได้ เช่นนี้:

 

บางส่วนด้านบนจะแสดงผลทุกครั้งที่มีการร้องขอโดย 241 ตัวอย่างเช่น ต่อไป เรายังต้องสร้าง 258 บางส่วนที่จะใช้แบบอินไลน์ใน Trix:

 

ข้อแตกต่างเดียวที่คุณคงสังเกตเห็นก็คือ ตอนนี้เราได้รวมมันไว้ใน Turbo Frame โดยใช้ SGID เป็นรหัส DOM นอกจากนี้ เรายังจัดเตรียมดัชนีแถวและคอลัมน์ให้กับบล็อกตัวคั่น และเตรียมพร้อมสำหรับการแก้ไขแบบอินไลน์โดยสร้าง DIV ภายใน 267 — เราจะพูดถึงเรื่องนั้นในภายหลัง

ตอนนี้เราจะเชื่อมต่อปุ่มตารางของแถบเครื่องมือกับการดำเนินการควบคุมฝั่งเซิร์ฟเวอร์ที่เราเพิ่งเขียน ในการดำเนินการนี้ ก่อนอื่นเราต้องนำไลบรารี่ request.js ของ Rails เข้ามาในโปรเจ็กต์ก่อน ไลบรารีนี้จะช่วยเราจัดการ 278 คำขอจากไคลเอนต์ รวมถึงโทเค็น CSRF ที่เหมาะสม ฯลฯ:

 

สร้างตัวควบคุม Trix Table Stimulus ใหม่

ตอนนี้ทุกอย่างได้รับการตั้งค่าแล้ว เรามาสร้าง trix-table ใหม่กัน ตัวควบคุมการกระตุ้น ในนั้นเราจะใช้ 284 การดำเนินการที่อ้างอิงโดยปุ่มแถบเครื่องมือของเรา:

 

มันจะ POST ไปที่ 296 ของตาราง เส้นทาง โดยแทรกการตอบสนอง JSON เป็นไฟล์แนบ Trix . สิ่งนี้ยืมมาจากโพสต์บล็อกของ OnRails อีกครั้งโดยแลกเปลี่ยน rails-ujs ที่เลิกใช้แล้ว เรียกใช้ request.js ที่ใหม่กว่า ห้องสมุด

ตอนนี้เราต้องใช้คอนโทรลเลอร์นี้ในแอปของเราโดยเพิ่มมันลงในมาร์กอัปของแบบฟอร์ม:

 

ข้อดีของ Stimulus.js คือการเพิ่มแอตทริบิวต์ข้อมูลเพียง 2 รายการลงใน 306 องค์ประกอบบรรลุผลตามที่ต้องการ ขณะนี้เราสามารถเพิ่มตารางลงในเนื้อหาบทความของเราได้ด้วยการคลิกเพียงปุ่มเดียว:

สร้างตัวแก้ไขตารางแบบไดนามิกใน Rails โดยใช้ Trix และ Turbo Frames

การจัดการตารางผ่าน Turbo Frames

ตอนนี้เราสามารถสร้างไฟล์แนบตารางได้แล้ว เรามาเปลี่ยนโฟกัสไปที่การจัดการเนื้อหากันดีกว่า ปรากฎว่า Turbo Frames เกือบ พอดีอย่างเป็นธรรมชาติที่นี่

เพิ่มและลบแถวและคอลัมน์ของตาราง

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

 

ในทางกลับกัน เรายังจำเป็นต้องเพิ่มการดำเนินการของคอนโทรลเลอร์ที่เกี่ยวข้องให้กับ 331 ของเรา . สังเกตว่า 349 การดำเนินการมอบหมายการกระทำเหล่านั้นให้กับโมเดล

 

หลังจากบันทึกการเปลี่ยนแปลงโครงสร้างของตารางแล้ว เราจะเปลี่ยนเส้นทางไปยังมุมมองแก้ไขของตาราง มันแสดงผล 354 เหมือนกัน บางส่วนซึ่งมีผลข้างเคียงจากการอ้างถึง Turbo Frame เดียวกัน ดังนั้น Turbo จึงสามารถตรวจจับเฟรมที่ตรงกันและแทนที่เฟรมหนึ่งด้วยเฟรมอื่นได้

 

ตอนนี้เราต้องใช้คำสั่งที่หายไปใน 367 รุ่น.

 

ที่น่าสังเกตคือ 375 เนื่องจากโครงสร้างข้อมูลที่เรียบง่ายของเราในอาร์เรย์สองมิติ วิธีการเป็นเพียงพร็อกซีในการแก้ไขจำนวนคอลัมน์และแถว เมื่อพร้อมแล้ว เราสามารถเปลี่ยนโครงสร้างของตารางได้ด้วยการคลิกปุ่ม:

สร้างตัวแก้ไขตารางแบบไดนามิกใน Rails โดยใช้ Trix และ Turbo Frames

แก้ไขเนื้อหาของเซลล์ตาราง

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

 

382 เมธอดจะออกคำขอ PATCH ทุกครั้งที่แก้ไขเซลล์ โดยส่งดัชนีแถวและคอลัมน์เป็นพารามิเตอร์ ตอนนี้ สิ่งที่เราต้องทำคือเชื่อมต่อกับ DOM ของเรา:

 

ฝั่งเซิร์ฟเวอร์ 399 แน่นอนว่าตอนนี้ต้องการวิธีจัดการกับการดำเนินการนี้ โชคดีที่สิ่งนี้ทำได้อย่างง่ายดายในการพิสูจน์แนวคิดแบบง่ายของเราโดยการเพิ่มสาขาอื่นให้กับเงื่อนไขของเรา นอกจากนี้เรายังตรวจสอบให้แน่ใจว่า 409 ขณะนี้การดำเนินการสามารถจัดการคำขอประเภท JSON ได้ แม้ว่าจะเป็นเพียงการส่งคืนออบเจ็กต์ว่างที่นี่ก็ตาม

 

โปรดทราบว่าในแอปที่ใช้งานจริง ฉันขอแนะนำให้คุณเลือกกลยุทธ์อื่นในการฆ่าเชื้อการดำเนินงานมากกว่า 413 สภาพ ฉันอาจจะติดต่อหาคนกลางหรือผู้รับมอบฉันทะในกรณีนี้

ข้อจำกัดของ Trix ใน Ruby

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

สร้างตัวแก้ไขตารางแบบไดนามิกใน Rails โดยใช้ Trix และ Turbo Frames

หากเราต้องรีเฟรชหน้าตอนนี้ เนื้อหาที่เพิ่มจะปรากฏขึ้น เนื่องจากเอกสารของ Trix ได้รับการเตรียมใช้งานใหม่

ฉันได้ปักหมุดปัญหานี้ไว้ที่ตำแหน่งที่ Trix ซิงค์เอกสารภายในเมื่อการเปลี่ยนแปลงการเลือก มันแค่คลี่มันออกจากองค์ประกอบเงาที่นี่

ฉันพยายามเชื่อมต่อกับ 429 เหตุการณ์และป้องกันการซิงค์เพียงแค่เบลอตาราง แต่โซลูชันที่ฉันคิดขึ้นมาทั้งหมดดูยุ่งยากมากและขึ้นอยู่กับ API ภายในอย่างมาก

ฉันเดาว่าวิธีจัดการกับสิ่งนี้แบบ Turbo-esque ที่สุดคือห่อแบบฟอร์มทั้งหมดไว้ใน Turbo Frame ที่โหลดไว้อย่างกระตือรือร้น และบอกให้โหลดซ้ำทุกครั้งที่เนื้อหาของ Trix เปลี่ยนแปลง

บางสิ่งเช่นนี้ควรทำเคล็ดลับ:

 

หากคุณใส่แบบฟอร์มของคุณใน Turbo Frame ที่คุณโหลดจาก 430 :

 

วิธีการนี้จะใช้ได้กับบันทึกฐานที่มีอยู่แล้วเท่านั้น

คำเตือนสุดท้ายเกี่ยวกับ Trix

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

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

สิ่งที่จับได้ประการที่สองคือมันไม่ได้ใช้ 442 ของ Trix ฟังก์ชั่น (แต่นั่นก็เป็นจริงสำหรับไฟล์แนบ Trix ใด ๆ ) ในทำนองเดียวกัน ก็ควรที่จะรอการเปลี่ยนแปลงอัปสตรีมแทนที่จะปรับแต่ง API ภายใน

สรุป

ในโพสต์นี้ เราเริ่มต้นด้วยการดูพื้นฐานของไฟล์แนบ ActionText อย่างรวดเร็ว จากนั้นเราได้เพิ่มตารางให้กับโมเดล ActionText ก่อนที่จะปรับแต่งโดยใช้ Turbo Frames ในที่สุด เราก็ได้สัมผัสถึงข้อจำกัดบางประการของการใช้ Trix แล้ว

เนื่องจาก Trix v2 อยู่ระหว่างดำเนินการ ซึ่งมีการแปลจาก CoffeeScript เป็น JavaScript สมัยใหม่ ตอนนี้จึงเป็นเวลาที่ดีที่จะจัดการกับความเข้ากันได้ของ Turbo ในปัจจุบัน ขอบเขตของสิ่งที่ Wrapper อาจดูเหมือนอยู่นอกเหนือความสามารถของฉัน แต่ดูเหมือนว่าจะเป็นหน้าต่างแห่งโอกาสอย่างแน่นอน

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

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