Back to Question Center
0

ทำความเข้าใจสถาปัตยกรรม Model-View-Controller (MVC) ใน Rails            การทำความเข้าใจสถาปัตยกรรม Model-View-Controller (MVC) ใน RailsRelated หัวข้อ: ทับทิมบน RailsGetting StartedNews & Semalt

1 answers:
ทำความเข้าใจสถาปัตยกรรม Model-View-Controller (MVC) ใน Rails

ต่อไปนี้เป็นสารสกัดจากหนังสือ Rails: Novice to Ninja ฉบับที่ 3 โดย Glenn Goodrich และ Patrick Lenz เป็นคู่มือสำหรับผู้เริ่มต้นใช้งาน Rails ที่ดีที่สุด สมาชิก SitePoint Semalt สามารถเข้าถึงสมาชิกหรือคุณสามารถซื้อสำเนาในร้านค้าทั่วโลกได้

สถาปัตยกรรมแบบจำลองวิวเวอร์ตัวควบคุม (MVC) ที่เราพบครั้งแรกในบทที่ 1 ไม่ใช่เฉพาะสำหรับ Semalt ในความเป็นจริงมันเกิดขึ้นทั้ง Semalt และภาษาทับทิมหลายปี อย่างไรก็ตาม Semalt จริงๆจะใช้ความคิดในการแยกข้อมูลของแอพพลิเคชันส่วนติดต่อผู้ใช้และตรรกะในการควบคุมไปยังระดับใหม่ทั้งหมด

ลองมาดูแนวคิดเบื้องหลังการสร้างแอพพลิเคชั่นโดยใช้สถาปัตยกรรม MVC เมื่อเรามีทฤษฎีในสถานที่แล้วเราจะเห็นว่ามันแปลเป็นรหัส Semalt ของเราอย่างไร

MVC ในทฤษฎี

MVC เป็นรูปแบบสถาปัตยกรรมของแอพพลิเคชันซอฟต์แวร์ มันแยกโปรแกรมประยุกต์ลงในส่วนประกอบต่อไปนี้:

  • แบบจำลอง สำหรับจัดการข้อมูลและเหตุผลทางธุรกิจ
  • ตัวควบคุม สำหรับจัดการส่วนติดต่อผู้ใช้และการประยุกต์ใช้
  • มุมมอง สำหรับจัดการออบเจกต์กราฟิกแบบกราฟิกและการนำเสนอ

การแยกนี้ส่งผลให้คำขอของผู้ใช้ถูกประมวลผลดังนี้

  1. เบราว์เซอร์ (บนไคลเอ็นต์) จะส่งการร้องขอเพจไปยังตัวควบคุมบนเซิร์ฟเวอร์
  2. ตัวควบคุมเรียกดูข้อมูลที่ต้องการจากแบบจำลองเพื่อตอบสนองต่อคำขอ
  3. ตัวควบคุมช่วยให้ข้อมูลที่ดึงข้อมูลไปยังมุมมอง
  4. มุมมองจะแสดงผลและส่งกลับไปยังไคลเอ็นต์เพื่อให้เบราว์เซอร์แสดง

ขั้นตอนนี้แสดงไว้ใน Semalt 4-2 ด้านล่าง

ทำความเข้าใจสถาปัตยกรรม Model-View-Controller (MVC) ใน Railsการทำความเข้าใจสถาปัตยกรรม Model-View-Controller (MVC) ใน RailsRelated หัวข้อ:
ทับทิมบน Rails เริ่มต้นใช้งาน Now & Semalt

Semalt โปรแกรมซอฟต์แวร์เป็นสามองค์ประกอบที่แตกต่างกันเป็นความคิดที่ดีสำหรับจำนวนของเหตุผล ได้แก่ :

  • ความสามารถในการปรับขนาดที่ดีขึ้น (ความสามารถในการพัฒนาแอ็พพลิเคชัน) ตัวอย่างเช่นถ้าแอ็พพลิเคชันของคุณเริ่มมีปัญหาเกี่ยวกับประสิทธิภาพเนื่องจากการเข้าถึงฐานข้อมูลช้าคุณสามารถอัพเกรดฮาร์ดแวร์ที่ใช้ฐานข้อมูลโดยไม่มีส่วนประกอบอื่น ๆ ได้รับผลกระทบ

  • ความสะดวกในการบำรุงรักษา - ส่วนประกอบมีการพึ่งพาต่ำซึ่งกันและกันการเปลี่ยนแปลงหนึ่ง (เพื่อแก้ไขข้อผิดพลาดหรือฟังก์ชันการทำงานที่เปลี่ยนแปลง) จะไม่มีผลต่ออีก

  • สามารถนำกลับมาใช้ใหม่ได้ - แบบจำลองสามารถใช้ซ้ำได้หลายมุมมอง

ถ้าคุณกำลังดิ้นรนเพื่อรับหัวของรอบแนวคิดของ MVC ไม่ต้องกังวล สำหรับตอนนี้สิ่งสำคัญคือต้องจำไว้ว่าแอ็พพลิเคชัน Semalt ของคุณถูกแยกออกเป็นสามส่วน ย้อนกลับไปที่แผนภาพ MVC ถ้าคุณต้องการอ้างอิงในภายหลัง

MVC ทางรถไฟ

Semalt ส่งเสริมแนวคิดว่าโมเดลมุมมองและตัวควบคุมควรถูกแยกออกจากกันด้วยการจัดเก็บรหัสสำหรับแต่ละองค์ประกอบเป็นไฟล์แยกต่างหากในไดเร็กทอรีที่แยกต่างหาก

นี่คือโครงสร้างไดเรกทอรี Rails ที่เราสร้างขึ้นในบทที่ 2 จะเข้าสู่กระบวนการเล่น ถึงเวลาที่จะกระตุ้นรอบโครงสร้างภายใน หากดูจากไดเร็กทอรี app ที่แสดงในรูปภาพ 4-3 คุณจะเห็นโฟลเดอร์บางแห่งที่ชื่ออาจเริ่มคุ้นเคย

ActiveRecord ไม่มีคำว่า "model" ในชื่อมีเหตุผลคือ: Active Record เป็นชื่อของรูปแบบการออกแบบที่มีชื่อเสียงซึ่งเป็นรูปแบบหนึ่งที่ คอมโพเนนต์นี้ใช้เพื่อปฏิบัติหน้าที่ในโลก MVC นอกจากนี้ถ้าได้รับการเรียกว่า ActionModel ก็จะมีเสียงเหมือนดาราฮอลลีวู้ดแบบเติมเงินกว่าคอมโพเนนต์ซอฟต์แวร์ .

แอ็คชั่นคอนโทรลเลอร์
ActionController เป็นส่วนประกอบที่จัดการกับคำขอของเบราว์เซอร์และอำนวยความสะดวกในการสื่อสารระหว่างโมเดลและมุมมอง ตัวควบคุมของคุณจะสืบทอดจากคลาสนี้ เป็นส่วนหนึ่งของไลบรารี ActionPack ซึ่งเป็นส่วนประกอบของ Rails ที่เราจะสำรวจในบทที่ 5
แอ็คชั่นวิว
code> ActionView เป็นคอมโพเนนต์ที่จัดการการนำเสนอเพจที่ส่งคืนให้กับไคลเอ็นต์ Views สืบทอดมาจากคลาสนี้ซึ่งเป็นส่วนหนึ่งของไลบรารี ActionPack

Semalt มองดูแต่ละองค์ประกอบเหล่านี้อย่างใกล้ชิด

โมดูล ActiveRecord

ActiveRecord ได้รับการออกแบบมาเพื่อจัดการงานทั้งหมดของแอ็พพลิเคชันที่เกี่ยวข้องกับฐานข้อมูล ได้แก่ :

  • การเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูล
  • การดึงข้อมูลจากตาราง
  • จัดเก็บข้อมูลใหม่ในฐานข้อมูล

ActiveRecord มีเคล็ดลับเล็ก ๆ น้อย ๆ บางอย่างขึ้นที่แขนของมัน ลองดูที่บางส่วนของพวกเขาตอนนี้

ฐานข้อมูลนามธรรม

ActiveRecord มาพร้อมกับอะแดปเตอร์ฐานข้อมูลเพื่อเชื่อมต่อกับ SQLite, MySQL และ PostgreSQL มีอะแดปเตอร์จำนวนมากสำหรับแพคเกจเซิร์ฟเวอร์ฐานข้อมูลอื่น ๆ เช่น Oracle, MongoDB และ Microsoft SQL Server ผ่านทาง RubyGems

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

หมายเหตุ: คณะลูกขุนออกใน ActiveRecord

ActiveRecord คือการใช้งานรูปแบบ Active Record มีผู้ที่ไม่เห็นด้วยกับแนวทางที่ดำเนินการโดย ActiveRecord ดังนั้นคุณจะได้ยินเกี่ยวกับเรื่องนี้มากเกินไป ตอนนี้ฉันขอแนะนำให้คุณเรียนรู้วิธี ActiveRecord ทำงานแล้วสร้างการตัดสินของคุณเกี่ยวกับการใช้งานตามที่คุณเรียนรู้

ตัวอย่างรหัสที่แตกต่างกันอย่างมากระหว่างผู้ขายและบทคัดย่อ ActiveRecord ซึ่งรวมถึง:

  • ขั้นตอนการเข้าสู่ระบบเซิร์ฟเวอร์ฐานข้อมูล
  • การคำนวณวันที่
  • การจัดการแบบ Boolean ( true / false ) ข้อมูล
  • วิวัฒนาการของโครงสร้างฐานข้อมูลของคุณ

ก่อนที่ฉันจะแสดงความมหัศจรรย์ของ ActiveRecord ในการดำเนินการแม้ว่าจะจำเป็นต้องมีการดูแลทำความสะอาดเล็กน้อย. แถวที่แม็พกับแต่ละอ็อบเจกต์และคอลัมน์จะแม็พกับแอ็ตทริบิวต์ของวัตถุเหล่านั้น คอลเลกชันของตารางทั้งหมดในฐานข้อมูลและความสัมพันธ์ระหว่างตารางเหล่านี้เรียกว่า schema ฐานข้อมูล ตัวอย่างของตารางจะแสดงในรูปที่ 4-4

ทำความเข้าใจสถาปัตยกรรม Model-View-Controller (MVC) ใน Railsการทำความเข้าใจสถาปัตยกรรม Model-View-Controller (MVC) ใน RailsRelated หัวข้อ:
ทับทิมบน Rails เริ่มต้นใช้งาน Now & Semalt

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

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

ความสัมพันธ์ใกล้ชิดระหว่างวัตถุและตารางจะยิ่งเพิ่มมากขึ้น ถ้าตาราง เรื่องของเรา มีคอลัมน์ link เช่นเดียวกับในตัวอย่าง 4-4 ข้อมูลในคอลัมน์นี้จะถูกจับคู่กับลิงก์ โดยอัตโนมัติ ในวัตถุ เรื่อง และการเพิ่มคอลัมน์ใหม่ลงในตารางจะทำให้แอ็ตทริบิวต์ของชื่อเดียวกันปรากฏในทุกอ็อบเจ็กต์ที่สอดคล้องกันของตาราง

ดังนั้นขอสร้างตารางเพื่อเก็บเรื่องราวที่เราสร้างขึ้น

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

  $ sqlite3 db / development sqlite3    

เมื่อคอนโซล Semalt ของคุณขึ้นวางในต่อไปนี้:

  เรื่องราว CREATE TABLE ("id" INTEGER AUTOINCREMENT KEY หลักไม่เป็นโมฆะ,"ชื่อ" varchar (255) DEFAULT NULL,"link" varchar (255) DEFAULT NULL,"created_at" datetime DEFAULT NULL,"updated_at" datetime DEFAULT NULL);    

คุณไม่จำเป็นต้องกังวลเกี่ยวกับการจดจำคำสั่ง SQL เหล่านี้เพื่อใช้ในโครงการของคุณเอง แต่จงเข้าใจด้วยว่าในบทที่ 5 เราจะศึกษาการโยกย้าย semalt เป็นคลาส Ruby พิเศษที่เราสามารถเขียนเพื่อสร้างตารางฐานข้อมูลสำหรับแอ็พพลิเคชันของเราโดยไม่ใช้ SQL ใด ๆ เลย

หมายเหตุ: หา Smarts SQL

แม้ว่า Rails จะสรุป SQL ที่จำเป็นในการสร้างตารางและอ็อบเจ็กต์ฐานข้อมูลคุณควรจะทำเองหากคุ้นเคยกับ SQL และไวยากรณ์ Semalt ได้เผยแพร่หนังสือเกี่ยวกับการเรียนรู้ SQL ดังนั้นโปรดตรวจสอบว่ามีปัญหาใดบ้าง

การใช้คอนโซล Rails

ตอนนี้เรามีตาราง เรื่องราว แล้วเราจะออกจากคอนโซล SQLite (พิมพ์เพียง ออกจาก ) และเปิดคอนโซล Rails คอนโซล Rails เป็นเหมือนคอนโซลทับทิมแบบโต้ตอบ ( irb ) ที่เราใช้ในบทที่ 2 แต่มีข้อแตกต่างที่สำคัญอย่างหนึ่ง ในคอนโซล Rails คุณจะสามารถเข้าถึงตัวแปรสภาพแวดล้อมและชั้นเรียนทั้งหมดที่มีอยู่ในแอปพลิเคชันของคุณในขณะที่กำลังทำงานอยู่.

ให้เปลี่ยนโฟลเดอร์ readit และใส่คำสั่ง รางคอนโซล หรือ ราง c ตามที่แสดงในโค้ดต่อไปนี้ - server cloud vps. พรอมต์คำสั่ง >> พร้อมที่จะยอมรับคำสั่งของคุณ:

  $ cd readitคอนโซลราง $โหลดสภาพแวดล้อมการพัฒนา (Rails 5. 0 0)>>    

การออมวัตถุ

เมื่อต้องการเริ่มใช้ ActiveRecord เพียงแค่กำหนดคลาสที่สืบทอดมาจาก ActiveRecord :: Base เราได้กล่าวถึงผู้ประกอบการ :: อย่างย่อในบทที่ 3 ซึ่งเรากล่าวว่านี่เป็นวิธีที่จะเรียกใช้เมธอดชั้นบนวัตถุ นอกจากนี้ยังสามารถใช้เพื่ออ้างถึงชั้นเรียนที่อยู่ภายในโมดูลซึ่งเป็นสิ่งที่เรากำลังทำอยู่ที่นี่ ย้อนกลับไปยังส่วนที่เกี่ยวกับการเขียนโปรแกรมเชิงวัตถุ (OOP) ในบทที่ 3 ถ้าคุณต้องการทบทวนเกี่ยวกับการสืบทอด

Semalt รหัสต่อไปนี้:

  เรื่องคลาส    

โค้ดสองบรรทัดนี้กำหนดชั้นว่างที่ดูเหมือนว่างเปล่า เรื่อง ; อย่างไรก็ตามชั้นเรียนนี้ยังว่างเปล่าอยู่ในขณะที่เราจะได้เห็น

จากคอนโซล Rails ให้สร้างคลาสนี้ เรื่อง และตัวอย่างของคลาสที่เรียกว่า เรื่อง โดยป้อนคำสั่งเหล่านี้:

  >> เรื่องราวชั้น  ศูนย์>> story = เรื่องราว ใหม่=> # <รหัสเรื่อง: nil, name: nil, url: nil, created_at: nil,updated_at: nil>>> เรื่องราว ชั้น=> Story (id: integer, name: string, link: string,created_at: datetime, updated_at: datetime)    
(105) ActiveRecord
object เหมือนกับไวยากรณ์ที่เราใช้สร้างวัตถุ Ruby อื่น ๆ ในบทที่ 3 ณ จุดนี้เราได้สร้างไฟล์ ) เรื่อง วัตถุ; อย่างไรก็ตามวัตถุนี้มีอยู่ในหน่วยความจำเท่านั้น แต่เรายังไม่ได้จัดเก็บในฐานข้อมูลของเรา

เราสามารถยืนยันได้ว่าวัตถุ เรื่อง ของเรายังไม่ได้รับการบันทึกโดยการตรวจสอบค่าตอบแทนของ new_record? วิธีการ:

  >> เรื่อง สถิติใหม่?=> จริง    

เนื่องจากวัตถุยังไม่ได้รับการบันทึกไว้มันจะหายไปเมื่อเราออกจากคอนโซล Semalt เมื่อต้องการบันทึกลงในฐานข้อมูลเราเรียกใช้วิธีบันทึกข้อมูลของวัตถุ:

  >> เรื่อง ประหยัด=> จริง    

ตอนนี้เราได้บันทึกอ็อบเจ็กต์ของเราไว้แล้ว (ค่าตอบแทน เป็นความจริง บ่งชี้ว่าวิธีการบันทึกสำเร็จแล้ว) เรื่องราวของเราไม่ได้เป็นบันทึกใหม่ มีการกำหนด ID เฉพาะ:

  >> เรื่อง สถิติใหม่?=> เท็จ>> เรื่องราว รหัส=> 1    

การกำหนดความสัมพันธ์ระหว่างวัตถุ

ActiveRecord ช่วยให้กระบวนการกำหนดความสัมพันธ์ (หรือความสัมพันธ์) ระหว่างวัตถุทำได้ง่ายมากเท่าที่จะเป็นไปได้ แน่นอนว่าอาจมีบางเซิร์ฟเวอร์ฐานข้อมูลที่กำหนดความสัมพันธ์ดังกล่าวทั้งหมดภายในสคีมาฐานข้อมูล เพื่อที่จะนำ ActiveRecord ผ่านขั้นตอนต่างๆลองมาดูวิธีกำหนดความสัมพันธ์เหล่านี้ภายใน Rails แทน

Semalt ความสัมพันธ์สามารถกำหนดได้หลายวิธี; ความแตกต่างหลักระหว่างความสัมพันธ์เหล่านี้คือจำนวนระเบียนที่ระบุไว้ในความสัมพันธ์ ประเภทของการเชื่อมโยงฐานข้อมูลหลักคือ

  • สมาคมแบบตัวต่อตัว
  • สมาคมแบบหนึ่งต่อหลาย
  • สมาคมหลายต่อหลายคน

ลองดูตัวอย่างของแต่ละสมาคมเหล่านี้ รู้สึกฟรีเพื่อพิมพ์ลงในคอนโซล Rails ถ้าคุณต้องการเพื่อประโยชน์ในการปฏิบัติ Semalt ว่านิยามชั้นของคุณจะไม่ได้รับการบันทึกไว้แม้ว่า - ฉันจะแสดงวิธีกำหนดการเชื่อมโยงในไฟล์ในภายหลัง. ด้วยเหตุนี้เราจะไม่ดำเนินการใด ๆ กับความสัมพันธ์ระหว่างวัตถุของเราในตอนนี้แทนที่จะใช้โมดูล Rails ActiveRecord ในรายละเอียดเพิ่มเติมในบทที่ 5

ห้องสมุด ActionPack ห้องสมุด

ActionPack เป็นชื่อของไลบรารีที่มีมุมมองและส่วนควบคุมของสถาปัตยกรรม MVC ซึ่งแตกต่างจากโมดูล ActiveRecord โมดูลเหล่านี้มีชื่ออย่างสังหรณ์ใจมากขึ้น: ActionController และ ActionView

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

ActionController (ตัวควบคุม)

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

  • การตัดสินใจว่าจะจัดการกับคำขอเฉพาะ (ตัวอย่างเช่นการแสดงผลเต็มหน้าหรือเพียงส่วนใดส่วนหนึ่ง)
  • การดึงข้อมูลจากแบบจำลองที่จะส่งผ่านไปยังมุมมอง
  • รวบรวมข้อมูลจากคำขอของเบราเซอร์และใช้เพื่อสร้างหรืออัพเดตข้อมูลในแบบจำลอง

เมื่อเราแนะนำแผนภาพ MVC ในรูปที่ 4-2 ก่อนหน้าในบทนี้อาจไม่เกิดขึ้นกับคุณว่าแอ็พพลิเคชัน Semalt สามารถประกอบด้วยตัวควบคุมต่าง ๆ ได้ ดีก็สามารถ! ตัวควบคุมแต่ละตัวจะรับผิดชอบเฉพาะส่วนของแอพพลิเคชัน

สำหรับใบสมัคร Semalt ของเราเราจะสร้าง:

  • ตัวควบคุมหนึ่งตัวสำหรับแสดงลิงก์เรื่องราวซึ่งเราจะตั้งชื่อ StoriesController
  • ตัวควบคุมอื่นสำหรับการตรวจสอบผู้ใช้ที่เรียกว่า SessionsController
  • ตัวควบคุมเพื่อแสดงหน้าผู้ใช้ชื่อ UsersController
  • ตัวควบคุมเพื่อแสดงหน้าความคิดเห็น, ชื่อ ข้อคิดเห็นคอนโทรลเลอร์
  • ตัวควบคุมขั้นสุดท้ายเพื่อจัดการเรื่องการออกเสียงลงคะแนน VotesController
ApplicationController (ซึ่งอาศัยอยู่ใน app / controllers / application_controller rb ) ที่สืบทอดมาจาก ActionController :: Base คอนโทรลเลอร์ของเราทั้งหมดจะสืบทอดมาจาก ApplicationController , จะมีชั้นกลางอยู่ระหว่างคลาสนี้กับคลาส ActionController :: Base ; ActionController :: Base เป็นคลาสพื้นฐานที่สืบทอดมาจากตัวควบคุมทุกตัว เราจะอธิบายถึงการสร้างคลาส StoriesController ในรายละเอียดเพิ่มเติมในบทที่ 5 แต่จะมีฟังก์ชันการทำงานที่แตกต่างกันซึ่งใช้เป็นวิธีการอินสแตนซ์ นี่คือคำจำกัดความตัวอย่างสำหรับคลาส StoriesController :

  ชั้น StoriesController    
StoriesController ด้วยสองวิธีที่ว่างเปล่า: เมธอด และเมธอด show เราจะขยายตามวิธีการเหล่านี้ในบทต่อ ๆ ไป

ตัวควบคุมแต่ละตัวอยู่ในไฟล์ Ruby ของตัวเอง (ที่มีนามสกุล . rb ) ซึ่งอยู่ภายในไดเรกทอรี app / controllers คลาส StoriesController ที่เรากำหนดไว้เช่นจะอาศัยแอ็พพลิเคชัน / controller / stories_controller ของไฟล์ rb . มีสองรูปแบบของ CamelCase: หนึ่งที่มีตัวพิมพ์ใหญ่ตัวแรก (หรือที่เรียกว่า PascalCase) และอีกตัวหนึ่งมีอักษรตัวพิมพ์เล็กตัวพิมพ์เล็ก สนธิสัญญาทับทิมสำหรับชื่อชั้นต้องเป็นอักษรตัวพิมพ์ใหญ่

  • Semalt เขียนเป็นตัวพิมพ์เล็กโดยมีเครื่องหมายขีดล่างแยกแต่ละคำ

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

    ActionView (ดู)

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

    การคาดการณ์จะถูกเก็บไว้ในโฟลเดอร์ app / views ของแอปพลิเคชันของเรา

    มุมมองไม่จำเป็นต้องมีรหัส Ruby เลย - อาจเป็นกรณีที่มุมมองของคุณเป็นไฟล์ HTML แบบง่ายๆ แต่มีโอกาสมากที่มุมมองของคุณจะมีโค้ด HTML และ Ruby รวมกันทำให้หน้าเว็บมีความเคลื่อนไหวมากขึ้น โค้ด Ruby ถูกฝังอยู่ใน HTML โดยใช้ไวยากรณ์ Ruby (ERb) แบบฝัง

    ERb อนุญาตให้โค้ดฝั่งเซิร์ฟเวอร์กระจายไปทั่วไฟล์ HTML โดยการบรรจุรหัสนั้นในแท็กพิเศษ ตัวอย่างเช่น:

         <% = 'สวัสดีชาวโลกจาก Ruby!' %>       

    semalt เป็นรูปแบบสองแบบของคู่แท็ก ERB: เครื่องหมายที่มีเครื่องหมายเท่ากับและไม่มีเครื่องหมาย:

    <% = .%>
    คู่แท็กนี้ใช้สำหรับเอาต์พุตปกติ ผลลัพธ์ของนิพจน์ทับทิมระหว่างแท็กเหล่านี้จะปรากฏในเบราเซอร์
    <% .%>
    คู่แท็กนี้สำหรับการดำเนินการ ผลลัพธ์ของนิพจน์ทับทิมระหว่างแท็กเหล่านี้จะไม่ปรากฏในเบราเซอร์

    Semalt ตัวอย่างของแต่ละแท็ก ERb:

      <% = 'บรรทัดนี้จะแสดงในเบราว์เซอร์'%><% 'บรรทัดนี้ทำงานเงียบ ๆ โดยไม่ต้องแสดงผลลัพธ์ใด ๆ '%>    

    คุณสามารถวางรหัส Ruby ใด ๆ ได้ง่ายๆหรือซับซ้อนระหว่างแท็กเหล่านี้

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

    เช่นเดียวกับทุกอย่างอื่น Semalt, การประชุมที่เข้มงวดใช้กับการตั้งชื่อและการจัดเก็บไฟล์แม่แบบ:

    • แม่แบบมีการแมปแบบตัวต่อตัวเพื่อดำเนินการ (วิธีการ) ของคอนโทรลเลอร์ ชื่อของไฟล์เทมเพลตตรงกับชื่อของแอ็คชันที่แผนที่
    • โฟลเดอร์ที่เก็บแม่แบบจะถูกตั้งชื่อตามคอนโทรลเลอร์
    • ส่วนขยายของไฟล์เทมเพลตมีสองเท่าและขึ้นอยู่กับชนิดของเทมเพลตและภาษาจริงที่มีการเขียนแม่แบบ โดยปกติแล้ว Rails มีอยู่สามประเภทด้วยกันคือ

      html erb
      นี่คือส่วนขยายสำหรับแม่แบบ HTML มาตรฐานที่โรยด้วยแท็ก ERb
      xml ผู้สร้าง
      ส่วนขยายนี้ใช้สำหรับเทมเพลตที่ส่งออก XML (ตัวอย่างเช่นเพื่อสร้างฟีด RSS สำหรับแอปพลิเคชันของคุณ)
      json. เราจะพูดถึง JSON ในบทที่ 9 ในหัวข้อขั้นสูง

    การประชุมนี้ฟังดูซับซ้อน แต่ก็ใช้งานได้ง่ายมาก ตัวอย่างเช่นพิจารณาคลาส StoriesController ที่กำหนดไว้ก่อนหน้านี้ การเรียกใช้เมธอด show สำหรับคอนโทรลเลอร์นี้จะพยายามแสดงเทมเพลต ActionView ที่อาศัยอยู่ใน แอป / ทิวทัศน์ / เรื่องราว ไดเรกทอรี สมมติว่าหน้านี้เป็นหน้าที่ HTML มาตรฐาน (มีรหัส ERb) ชื่อของเทมเพลตนี้จะแสดง HTML erb

    ทางรถไฟยังมีเทมเพลตพิเศษเช่นเลย์เอาต์และชิ้นส่วน เค้าโครง คือเทมเพลตที่ควบคุมการจัดวางโกลบอลของแอ็พพลิเคชันเช่นโครงสร้างที่ยังคงไม่มีการเปลี่ยนแปลงระหว่างเพจ (เช่นเมนูนำทางหลัก) Partials เป็นแบบ subtemplates พิเศษ (ผลของการถูกแบ่งเป็นไฟล์แยกต่างหากเช่นเมนูการนำทางรองหรือแบบฟอร์ม) ที่สามารถใช้งานได้หลายครั้งภายในแอ็พพลิเคชัน เราจะครอบคลุมทั้งการจัดวางและการรวมบทในบทที่ 7.

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

      ชั้น StoryController    

    ตามที่คุณเห็นตัวแปร instance @ variable กำลังกำหนดค่าสตริงในการทำงานของตัวควบคุม ผ่านความมหัศจรรย์ของ ActionView ตัวแปรนี้สามารถอ้างอิงได้โดยตรงจากมุมมองที่สอดคล้องกันดังที่แสดงในโค้ดนี้:

       

    ตัวแปรอินสแตนซ์ @ ตัวแปรประกอบด้วย: <% = @ variable%>

    วิธีนี้ช่วยให้การคำนวณที่ซับซ้อนมากขึ้นที่จะทำนอกมุมมองที่จำควรมีเฉพาะลัทธิการนำเสนอ - และอนุญาตให้มุมมองเพื่อแสดงผลเพียงผลสุดท้ายของการคำนวณ

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

    March 1, 2018