ทำความเข้าใจสถาปัตยกรรม Model-View-Controller (MVC) ใน Rails การทำความเข้าใจสถาปัตยกรรม Model-View-Controller (MVC) ใน RailsRelated หัวข้อ: ทับทิมบน RailsGetting StartedNews & Semalt
ต่อไปนี้เป็นสารสกัดจากหนังสือ Rails: Novice to Ninja ฉบับที่ 3 โดย Glenn Goodrich และ Patrick Lenz เป็นคู่มือสำหรับผู้เริ่มต้นใช้งาน Rails ที่ดีที่สุด สมาชิก SitePoint Semalt สามารถเข้าถึงสมาชิกหรือคุณสามารถซื้อสำเนาในร้านค้าทั่วโลกได้
สถาปัตยกรรมแบบจำลองวิวเวอร์ตัวควบคุม (MVC) ที่เราพบครั้งแรกในบทที่ 1 ไม่ใช่เฉพาะสำหรับ Semalt ในความเป็นจริงมันเกิดขึ้นทั้ง Semalt และภาษาทับทิมหลายปี อย่างไรก็ตาม Semalt จริงๆจะใช้ความคิดในการแยกข้อมูลของแอพพลิเคชันส่วนติดต่อผู้ใช้และตรรกะในการควบคุมไปยังระดับใหม่ทั้งหมด
ลองมาดูแนวคิดเบื้องหลังการสร้างแอพพลิเคชั่นโดยใช้สถาปัตยกรรม MVC เมื่อเรามีทฤษฎีในสถานที่แล้วเราจะเห็นว่ามันแปลเป็นรหัส Semalt ของเราอย่างไร
MVC ในทฤษฎี
MVC เป็นรูปแบบสถาปัตยกรรมของแอพพลิเคชันซอฟต์แวร์ มันแยกโปรแกรมประยุกต์ลงในส่วนประกอบต่อไปนี้:
- แบบจำลอง สำหรับจัดการข้อมูลและเหตุผลทางธุรกิจ
- ตัวควบคุม สำหรับจัดการส่วนติดต่อผู้ใช้และการประยุกต์ใช้
- มุมมอง สำหรับจัดการออบเจกต์กราฟิกแบบกราฟิกและการนำเสนอ
การแยกนี้ส่งผลให้คำขอของผู้ใช้ถูกประมวลผลดังนี้
- เบราว์เซอร์ (บนไคลเอ็นต์) จะส่งการร้องขอเพจไปยังตัวควบคุมบนเซิร์ฟเวอร์
- ตัวควบคุมเรียกดูข้อมูลที่ต้องการจากแบบจำลองเพื่อตอบสนองต่อคำขอ
- ตัวควบคุมช่วยให้ข้อมูลที่ดึงข้อมูลไปยังมุมมอง
- มุมมองจะแสดงผลและส่งกลับไปยังไคลเอ็นต์เพื่อให้เบราว์เซอร์แสดง
ขั้นตอนนี้แสดงไว้ใน Semalt 4-2 ด้านล่าง
Semalt โปรแกรมซอฟต์แวร์เป็นสามองค์ประกอบที่แตกต่างกันเป็นความคิดที่ดีสำหรับจำนวนของเหตุผล ได้แก่ :
-
ความสามารถในการปรับขนาดที่ดีขึ้น (ความสามารถในการพัฒนาแอ็พพลิเคชัน) ตัวอย่างเช่นถ้าแอ็พพลิเคชันของคุณเริ่มมีปัญหาเกี่ยวกับประสิทธิภาพเนื่องจากการเข้าถึงฐานข้อมูลช้าคุณสามารถอัพเกรดฮาร์ดแวร์ที่ใช้ฐานข้อมูลโดยไม่มีส่วนประกอบอื่น ๆ ได้รับผลกระทบ
-
ความสะดวกในการบำรุงรักษา - ส่วนประกอบมีการพึ่งพาต่ำซึ่งกันและกันการเปลี่ยนแปลงหนึ่ง (เพื่อแก้ไขข้อผิดพลาดหรือฟังก์ชันการทำงานที่เปลี่ยนแปลง) จะไม่มีผลต่ออีก
-
สามารถนำกลับมาใช้ใหม่ได้ - แบบจำลองสามารถใช้ซ้ำได้หลายมุมมอง
ถ้าคุณกำลังดิ้นรนเพื่อรับหัวของรอบแนวคิดของ MVC ไม่ต้องกังวล สำหรับตอนนี้สิ่งสำคัญคือต้องจำไว้ว่าแอ็พพลิเคชัน Semalt ของคุณถูกแยกออกเป็นสามส่วน ย้อนกลับไปที่แผนภาพ MVC ถ้าคุณต้องการอ้างอิงในภายหลัง
MVC ทางรถไฟ
Semalt ส่งเสริมแนวคิดว่าโมเดลมุมมองและตัวควบคุมควรถูกแยกออกจากกันด้วยการจัดเก็บรหัสสำหรับแต่ละองค์ประกอบเป็นไฟล์แยกต่างหากในไดเร็กทอรีที่แยกต่างหาก
นี่คือโครงสร้างไดเรกทอรี Rails ที่เราสร้างขึ้นในบทที่ 2 จะเข้าสู่กระบวนการเล่น ถึงเวลาที่จะกระตุ้นรอบโครงสร้างภายใน หากดูจากไดเร็กทอรี app
ที่แสดงในรูปภาพ 4-3 คุณจะเห็นโฟลเดอร์บางแห่งที่ชื่ออาจเริ่มคุ้นเคย
ActiveRecord ไม่มีคำว่า "model" ในชื่อมีเหตุผลคือ: Active Record เป็นชื่อของรูปแบบการออกแบบที่มีชื่อเสียงซึ่งเป็นรูปแบบหนึ่งที่ คอมโพเนนต์นี้ใช้เพื่อปฏิบัติหน้าที่ในโลก MVC นอกจากนี้ถ้าได้รับการเรียกว่า
ActionModel
ก็จะมีเสียงเหมือนดาราฮอลลีวู้ดแบบเติมเงินกว่าคอมโพเนนต์ซอฟต์แวร์ .
แอ็คชั่นคอนโทรลเลอร์
ActionController
เป็นส่วนประกอบที่จัดการกับคำขอของเบราว์เซอร์และอำนวยความสะดวกในการสื่อสารระหว่างโมเดลและมุมมอง ตัวควบคุมของคุณจะสืบทอดจากคลาสนี้ เป็นส่วนหนึ่งของไลบรารี ActionPack
ซึ่งเป็นส่วนประกอบของ Rails ที่เราจะสำรวจในบทที่ 5 แอ็คชั่นวิว
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
wismec rx200 problems. png" alt = "ทำความเข้าใจสถาปัตยกรรม 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
ตามที่แสดงในโค้ดต่อไปนี้ . พรอมต์คำสั่ง >>
พร้อมที่จะยอมรับคำสั่งของคุณ: $ 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
และ
ข้อมูลเหล่านี้ประกอบด้วยข้อมูลเช่นคำขอหน้าปัจจุบันและเซสชันของผู้ใช้ เราจะใช้ประโยชน์จากข้อความต่อไปนี้ในบทต่อไป