Rails vs ใหม่สร้าง


195

เหตุใดจึงจำเป็นต้องกำหนดวิธีการใหม่ในตัวควบคุม RESTful ตามด้วยวิธีการสร้าง?

การค้นหาของ Google ไม่ได้ให้คำตอบที่ฉันต้องการ ฉันเข้าใจความแตกต่าง แต่จำเป็นต้องรู้ว่าทำไมพวกเขาถึงถูกใช้อย่างที่เป็น

คำตอบ:


263

ภายในการนำ Rails ไปใช้งาน REST ใหม่และสร้างจะได้รับการปฏิบัติแตกต่างกัน

HTTP GET to /resources/newมีวัตถุประสงค์เพื่อสร้างแบบฟอร์มที่เหมาะสมสำหรับการสร้างทรัพยากรใหม่ซึ่งทำได้โดยการเรียกการดำเนินการใหม่ภายในตัวควบคุมซึ่งจะสร้างเร็กคอร์ดที่ไม่ได้บันทึกใหม่และแสดงผลฟอร์ม

HTTP POST เพื่อ/resourcesรับการบันทึกที่สร้างขึ้นเป็นส่วนหนึ่งของการดำเนินการใหม่และส่งผ่านไปยังการดำเนินการสร้างภายในตัวควบคุมซึ่งจะพยายามบันทึกลงในฐานข้อมูล


1
ฉันอ่านข้อมูลนี้ในเว็บไซต์กวดวิชา ไม่ได้จนกว่าฉันจะใช้จริง ๆ แล้วมันจะเกี่ยวข้อง
StorymasterQ

249

จากเอกสารActiveRecord :: Base :

สร้าง (attribute = nil) {| object | ... }

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

ใหม่ (attribute = nil) {| ตนเองถ้า block_given? | ... }

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

ดังนั้นcreateinstantiates วัตถุใหม่ตรวจสอบแล้วบันทึกลงในฐานข้อมูล และnewสร้างวัตถุในท้องถิ่นเท่านั้น แต่ไม่ได้พยายามตรวจสอบหรือบันทึกลงในฐานข้อมูล


6
คำถามนี้เกี่ยวกับวิธีการควบคุมไม่ใช่วิธีการจำลอง
sevenseacat

8
@Karpie - ขอบคุณสำหรับการโหวต คุณให้คะแนนที่ดี แต่ให้พิจารณาว่าผู้คนจำนวนมากพบว่าคำตอบนี้มีประโยชน์โดยเฉพาะอย่างยิ่งเนื่องจากไม่มีชื่อเรื่องหรือแท็กเรียกมันว่าเป็นคำถามสำหรับคอนโทรลเลอร์เท่านั้น ดังนั้นฉันคิดว่าคำตอบนี้ให้คุณค่าเหมือนกัน
Justin Ethier

17

ใหม่ instantiates อินสแตนซ์โมเดลใหม่ แต่จะไม่ถูกบันทึกจนกว่าจะมีการเรียกวิธีการบันทึก

สร้างไม่เหมือนกับใหม่ แต่ยังบันทึกไปยังฐานข้อมูล

บางครั้งคุณต้องการทำสิ่งต่าง ๆ ก่อนที่จะบันทึกบางสิ่งในฐานข้อมูลบางครั้งคุณเพียงต้องการสร้างและบันทึกในทันที


1
คำถามนี้เกี่ยวกับวิธีการควบคุมไม่ใช่วิธีการจำลอง
sevenseacat

11

ส่วน 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"ขอบคุณสำหรับคำตอบ แต่โดยส่วนตัวฉันพบว่าการตั้งชื่อแบบนี้ทำให้สับสนจริงๆ
Daniel Lizik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.