เหตุใดจึงจำเป็นต้องกำหนดวิธีการใหม่ในตัวควบคุม RESTful ตามด้วยวิธีการสร้าง?
การค้นหาของ Google ไม่ได้ให้คำตอบที่ฉันต้องการ ฉันเข้าใจความแตกต่าง แต่จำเป็นต้องรู้ว่าทำไมพวกเขาถึงถูกใช้อย่างที่เป็น
เหตุใดจึงจำเป็นต้องกำหนดวิธีการใหม่ในตัวควบคุม RESTful ตามด้วยวิธีการสร้าง?
การค้นหาของ Google ไม่ได้ให้คำตอบที่ฉันต้องการ ฉันเข้าใจความแตกต่าง แต่จำเป็นต้องรู้ว่าทำไมพวกเขาถึงถูกใช้อย่างที่เป็น
คำตอบ:
ภายในการนำ Rails ไปใช้งาน REST ใหม่และสร้างจะได้รับการปฏิบัติแตกต่างกัน
HTTP GET to /resources/new
มีวัตถุประสงค์เพื่อสร้างแบบฟอร์มที่เหมาะสมสำหรับการสร้างทรัพยากรใหม่ซึ่งทำได้โดยการเรียกการดำเนินการใหม่ภายในตัวควบคุมซึ่งจะสร้างเร็กคอร์ดที่ไม่ได้บันทึกใหม่และแสดงผลฟอร์ม
HTTP POST เพื่อ/resources
รับการบันทึกที่สร้างขึ้นเป็นส่วนหนึ่งของการดำเนินการใหม่และส่งผ่านไปยังการดำเนินการสร้างภายในตัวควบคุมซึ่งจะพยายามบันทึกลงในฐานข้อมูล
จากเอกสารActiveRecord :: Base :
สร้าง (attribute = nil) {| object | ... }
สร้างวัตถุ (หรือหลายวัตถุ) และบันทึกลงในฐานข้อมูลหากผ่านการตรวจสอบ วัตถุที่เป็นผลลัพธ์จะถูกส่งคืนว่าวัตถุนั้นได้รับการบันทึกไปยังฐานข้อมูลสำเร็จหรือไม่
ใหม่ (attribute = nil) {| ตนเองถ้า block_given? | ... }
วัตถุใหม่สามารถสร้างอินสแตนซ์ได้ว่าว่างเปล่า (ไม่มีพารามิเตอร์การสร้าง) หรือตั้งค่าล่วงหน้าพร้อมแอตทริบิวต์ แต่ยังไม่ได้บันทึก (ผ่านแฮชที่มีชื่อคีย์ที่ตรงกับชื่อคอลัมน์คอลัมน์ที่เกี่ยวข้อง) ในทั้งสองอินสแตนซ์คีย์แอตทริบิวต์ที่ถูกต้องจะถูกกำหนดโดยชื่อคอลัมน์ของตารางที่เกี่ยวข้องดังนั้นคุณจึงไม่สามารถมีแอททริบิวที่ไม่ได้เป็นส่วนหนึ่งของคอลัมน์ตาราง
ดังนั้นcreate
instantiates วัตถุใหม่ตรวจสอบแล้วบันทึกลงในฐานข้อมูล และnew
สร้างวัตถุในท้องถิ่นเท่านั้น แต่ไม่ได้พยายามตรวจสอบหรือบันทึกลงในฐานข้อมูล
ใหม่ instantiates อินสแตนซ์โมเดลใหม่ แต่จะไม่ถูกบันทึกจนกว่าจะมีการเรียกวิธีการบันทึก
สร้างไม่เหมือนกับใหม่ แต่ยังบันทึกไปยังฐานข้อมูล
บางครั้งคุณต้องการทำสิ่งต่าง ๆ ก่อนที่จะบันทึกบางสิ่งในฐานข้อมูลบางครั้งคุณเพียงต้องการสร้างและบันทึกในทันที
ส่วน RESTful ของ Rails นั้นใกล้เคียงกับการทำงานของโปรโตคอล HTTP ในโปรโตคอล HTTP คำขอ GET ไม่ควรแก้ไขข้อมูลใด ๆ ถ้าคุณดูที่การกระทำ RESTful ทั้งหมดใน Rails พวกเขาจะจับคู่กับการกระทำ HTTP POST ใช้สำหรับสร้างข้อมูลใหม่ดังนั้นมันจึงสร้างขึ้นอย่างมีเหตุผล คุณใช้ GET เพื่อแสดงเวอร์ชันของแบบฟอร์มนั้นหรือกล่าวอีกนัยหนึ่งคือการกระทำใหม่ ดัชนีและการแสดงยังได้รับการอัพเดตคือ PUT (หรือ PATCH ใน Rails 4+) และ destroy เป็น DELETE ใน HTTP
นอกจากนี้ยังแยกตรรกะในคอนโทรลเลอร์และช่วยให้คุณจัดการกับข้อผิดพลาดได้อย่างราบรื่น (โดยการเรนเดอร์การกระทำใหม่ด้วยข้อความแสดงข้อผิดพลาด)
"You use a GET to serve the form version of that or in other words, the new action"
ขอบคุณสำหรับคำตอบ แต่โดยส่วนตัวฉันพบว่าการตั้งชื่อแบบนี้ทำให้สับสนจริงๆ