Rails mới vs tạo


195

Tại sao cần phải xác định một phương thức mới trong bộ điều khiển RESTful, theo dõi nó với một phương thức tạo?

Tìm kiếm Google không cung cấp cho tôi câu trả lời mà tôi đang tìm kiếm. Tôi hiểu sự khác biệt, nhưng cần biết tại sao chúng được sử dụng theo cách của chúng.

Câu trả lời:


263

Trong quá trình triển khai REST và tạo REST mới của Rails được xử lý khác nhau.

HTTP GET to /resources/newđược dự định để hiển thị một biểu mẫu phù hợp để tạo tài nguyên mới, bằng cách gọi tài nguyên mới hành động trong bộ điều khiển, tạo ra một bản ghi chưa được lưu mới và hiển thị biểu mẫu.

HTTP POST để /resourceslấy bản ghi được tạo như một phần của hành động mới và chuyển nó sang hành động tạo trong bộ điều khiển, sau đó cố gắng lưu nó vào cơ sở dữ liệu.


1
Tôi đọc lướt chính xác thông tin này trong một trang web hướng dẫn đường ray. Không phải cho đến khi tôi thực sự sử dụng nó mà nó trở nên có liên quan.
StorymasterQ

248

Từ tài liệu ActiveRecord :: Base :

tạo (thuộc tính = nil) {| object | ...}

Tạo một đối tượng (hoặc nhiều đối tượng) và lưu nó vào cơ sở dữ liệu, nếu xác nhận vượt qua. Đối tượng kết quả được trả về cho dù đối tượng đã được lưu thành công vào cơ sở dữ liệu hay chưa.

mới (thuộc tính = nil) {| tự nếu block_given? | ...}

Các đối tượng mới có thể được khởi tạo dưới dạng trống (không có tham số xây dựng) hoặc được đặt trước với các thuộc tính nhưng chưa được lưu (chuyển một hàm băm với tên khóa khớp với tên cột của bảng liên quan). Trong cả hai trường hợp, các khóa thuộc tính hợp lệ được xác định bởi tên cột của bảng được liên kết - do đó bạn không thể có các thuộc tính không phải là một phần của các cột trong bảng.

Vì vậy, createkhởi tạo đối tượng mới, xác nhận nó và sau đó lưu nó vào cơ sở dữ liệu. Và newchỉ tạo đối tượng cục bộ nhưng không cố xác thực hoặc lưu nó vào DB.


5
Câu hỏi này là về các phương thức điều khiển, không phải các phương thức mô hình.
Sevenseacat

8
@Karpie - Cảm ơn các downvote. Bạn đưa ra một quan điểm tốt, nhưng hãy xem xét rằng rất nhiều người thấy câu trả lời này hữu ích, đặc biệt vì cả tiêu đề hoặc các thẻ không gọi nó là câu hỏi chỉ dành cho người điều khiển. Vì vậy, tôi nghĩ rằng câu trả lời này cung cấp giá trị như nhau.
Justin Ethier

16

Mới khởi tạo một thể hiện Model mới, nhưng nó không được lưu cho đến khi phương thức lưu được gọi.

Tạo làm tương tự như mới, nhưng cũng lưu nó vào cơ sở dữ liệu.

Đôi khi bạn muốn làm công cụ trước khi lưu một cái gì đó vào cơ sở dữ liệu, đôi khi bạn chỉ muốn tạo và lưu nó ngay lập tức.


1
Câu hỏi này là về các phương thức điều khiển, không phải các phương thức mô hình.
Sevenseacat

11

Các phần RESTful của Rails được tạo ra rất gần với cách thức hoạt động của giao thức HTTP. Trong giao thức HTTP, yêu cầu GET không cần phải sửa đổi bất kỳ dữ liệu nào. Về mặt logic, nếu bạn nhìn vào cách tất cả các hành động RESTful trong Rails hoạt động, chúng sẽ khớp với các hành động HTTP. POST là để tạo dữ liệu mới, vì vậy nó được tạo một cách hợp lý. Bạn sử dụng một GET để phục vụ phiên bản biểu mẫu của điều đó hoặc nói cách khác, hành động mới. Chỉ mục và hiển thị cũng là NHẬN, cập nhật là PUT (hoặc PATCH trong Rails 4+) và hủy là một XÓA trong HTTP.

Ngoài ra, nó tách biệt logic trong bộ điều khiển và cung cấp cho bạn một cách trơn tru để xử lý lỗi (bằng cách hiển thị lại hành động mới với thông báo lỗi).


"You use a GET to serve the form version of that or in other words, the new action"cảm ơn vì câu trả lời nhưng cá nhân tôi thấy quy ước đặt tên này thực sự khó hiểu
Daniel Lizik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.