2010-03-18 37 views
163

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

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

Trả lời

216

Trong khi triển khai Rails của REST mớitạo được xử lý khác nhau.

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

Một HTTP POST để /resources mất kỷ lục được tạo ra như một phần của hành động mới và vượt qua nó để 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

Cảm ơn lời giải thích, tôi đã nhầm lẫn với cả hai. – Batman

+1

Câu trả lời khác như thế này;) cảm ơn! – servatj

+0

Tôi đã đọc chính xác thông tin này trong 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

13

Tạo bản mẫu mới, nhưng nó không được lưu cho đến khi phương thức lưu được gọi.

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

Đôi khi bạn muốn thực hiện công cụ trước khi lưu nội dung nào đó 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 pháp điều khiển, không phải là phương pháp mô hình. – sevenseacat

219

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

tạo (thuộc tính = nil) {| đối tượng | ...}

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 thực 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 không.

new (attributes = nil) {| self if block_given? | ...}

Đối tượng mới có thể được khởi tạo là rỗng (không có thông số xây dựng) hoặc đặt trước với thuộc tính nhưng chưa được lưu (chuyển băm với tên khóa khớp với tên cột bảng được liên kết). Trong cả hai trường hợp, các khóa thuộc tính hợp lệ được xác định bởi các 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, create tạo đối tượng mới, xác thực và sau đó lưu đối tượng đó vào cơ sở dữ liệu. Và new chỉ 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.

+20

Khi tôi tìm thấy trang này, tôi đang tìm câu trả lời bạn đã cung cấp. Cảm ơn! – ClosureCowboy

+0

Không có vấn đề, vui lòng giúp đỡ :) –

+4

Câu hỏi này là về phương pháp điều khiển, không phải là phương pháp mô hình. – sevenseacat

9

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 phải sửa đổi bất kỳ dữ liệu nào. Một cách hợp lý, 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 GET để phục vụ phiên bản biểu mẫu của nó hoặc nói cách khác là hành động mới. Chỉ mục và hiển thị cũng là GET, cập nhật là một PUT (hoặc PATCH trong Rails 4+), và tiêu diệt là một DELETE trong HTTP.

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