2010-09-03 34 views
6

OK, tôi đang cố gắng hiểu các phương pháp hay nhất cho các phương thức CREATE và UPDATE cho cả hai định dạng HTML và XML. Mã mặc định cho một bộ điều khiển mà trình tạo ra đường ray tạo ra là một chút không rõ ràng đối với tôi.Thực tiễn tốt nhất cho trình điều khiển RESTful Phương thức CREATE và UPDATE

Đối với CREATE phương pháp, đưa ra một tốt tiết kiệm, máy phát điện nói với "redirect_to (@whatever)" cho HTML và "render: xml => @whatever,: status =>: tạo ra,: vị trí = > @whatever "cho XML.

Với tiết kiệm rất xấu, các máy phát điện nói với "render: action => 'mới'" cho HTML và "render: xml => @ whatever.errors,: status =>: unprocessable_entity" cho XML .

Tuy nhiên, đối với phương pháp UPDATE, được đưa ra một bản cập nhật tốt, các máy phát điện nói với "redirect_to (@whatever)" cho HTML và "đầu: ok" cho XML.

Và, đưa ra một bản cập nhật xấu, các máy phát điện nói với "render: action => 'chỉnh sửa'" cho HTML và "render: xml => @ whatever.errors,: status =>: unprocessable_entity" cho XML.

Tôi hiểu điều này, và nó có ý nghĩa với tôi, và làm việc tốt - NHƯNG, tôi có hai câu hỏi:

Đầu tiên, đối với một thành công tạo và cập nhật, định dạng HTML, tại sao "redirect_to (@whatever) "thay vì" hiển thị: action => 'show' "? Tôi hiểu sự khác biệt giữa chuyển hướng và kết xuất, chỉ tò mò hơn về cách bạn có xu hướng làm điều đó và tại sao. Có vẻ như chuyển hướng sẽ là một chuyến đi bổ sung không cần thiết để trình duyệt thực hiện.

Thứ hai, tại sao "đầu: ok" khi CẬP NHẬT thành công qua XML, nhưng "render: xml => @whatever,: status =>: tạo ra,: vị trí => @whatever" khi thành công CREATE qua XML? Điều này có vẻ không phù hợp với tôi. Có vẻ như một UPDATE thành công qua XML nên giống như một CREATE thành công thông qua XML. Có vẻ như bạn sẽ cần đối tượng mới/cập nhật được trả về để bạn có thể kiểm tra nó. Làm thế nào để các bạn làm điều đó và tại sao?

Trả lời

1

Tôi đã viết điều này khi Sam C trả lời, nhưng ở đây nó là anyway :-)

Đối với phần đầu tiên - tại sao chuyển hướng thay vì hiển thị? Hai lý do tôi có thể nghĩ đến:

1) Tính nhất quán. Nếu bạn hiển thị hành động hiển thị và người dùng sử dụng nút quay lại sau khi quay lại trang đó, người dùng sẽ thấy hành vi không mong muốn. Một số phiên bản của IE sẽ cung cấp cho bạn một số loại lỗi hết thời gian chờ phiên IIRC, các trình duyệt khác có thể xử lý nó một cách duyên dáng hơn một chút.

Tương tự, nếu người dùng đã đánh dấu trang đó và quay lại trang đó sau đó bằng yêu cầu GET - họ sẽ không thấy hành động hiển thị. Ứng dụng của bạn có thể ném lỗi hoặc có thể hiển thị hành động chỉ mục vì người dùng đang yêu cầu URL như http://my.app.com/users, sẽ ánh xạ tới hành động chỉ mục khi sử dụng yêu cầu GET.

2) nếu bạn hiển thị hành động hiển thị mà không chuyển hướng đến yêu cầu GET và lượt truy cập của người dùng làm mới, trình duyệt của bạn sẽ gửi lại yêu cầu POST với cùng một dữ liệu, có khả năng tạo các bản sao trùng lặp của bất kỳ nội dung nào bạn đang tạo . Trình duyệt sẽ cảnh báo người dùng về điều này để họ có thể hủy bỏ, nhưng nó có khả năng gây nhầm lẫn và sự bất tiện không cần thiết.

Đối với phần thứ hai của câu hỏi của bạn, không quá chắc chắn phải trung thực. Tôi đoán là vì bạn đã cập nhật đối tượng được đề cập, bạn đã có một bản sao của nó nên không cần một thể hiện khác của nó được trả về. Có nói rằng, cập nhật một đối tượng có thể kích hoạt callbacks khác nhau mà sửa đổi các thuộc tính khác của đối tượng, do đó, trả lại đối tượng cập nhật với những sửa đổi có thể có ý nghĩa.

+1

Tôi đồng ý với câu trả lời của bạn cho phần thứ hai của câu hỏi của tôi. Và câu trả lời của bạn cho phần đầu tiên của câu hỏi của tôi có ý nghĩa, nhưng sau đó đặt ra một câu hỏi khác: Tại sao, sau khi tạo hoặc cập nhật không thành công, được sử dụng và không redirect_to cho cùng một lý do bạn đã đề cập? Điều gì sẽ xảy ra nếu người dùng muốn đánh dấu trang chỉnh sửa hoặc trang mới? Nếu kết xuất đã được sử dụng, thì chúng sẽ vẫn ở trên trang "/ whatevers" (sai). – Buddy

+1

Nếu người dùng được chuyển hướng đến hành động mới/chỉnh sửa, tất cả dữ liệu POST được gửi sẽ bị mất và biểu mẫu được hiển thị sẽ trống. Bạn đúng là người dùng có thể đánh dấu trang lỗi được hiển thị và nó sẽ trỏ đến URL sai. Không có cách nào để ngăn chặn AFAIK này. – Sidane

+0

Ồ vâng, duh. Tôi đã nghĩ không chính xác rằng bạn có thể chuyển hướng đến trang mới hoặc chỉnh sửa VÀ chuyển một @object. Tôi đã sai. Cảm ơn cho tôi đặt thẳng! – Buddy

1

Khi tạo hoặc cập nhật, redirect_to(@whatever) để xóa bài đăng, để người dùng không gửi lại bằng cách làm mới. Nó cũng hiển thị url chính xác trong thanh địa chỉ cho trường hợp tạo, trong đó gửi tới đường dẫn thu thập (/ whatevers).

head :ok đưa ra phản hồi tối thiểu khi cập nhật, khi thường bạn đã có đối tượng trong dom. Nếu bạn đang cập nhật trang sau khi cập nhật, phương pháp chuẩn là sử dụng các khung nhìn rjs để cập nhật các phần tử dom và kết xuất các partials.

+0

Tôi đồng ý với câu trả lời của bạn cho # 1, nhưng tôi không chắc chắn về # 2. Giống như Sidane nói dưới đây, đối tượng có thể được thay đổi bằng callbacks. Ngoài ra, vì hành vi mặc định "im lặng bỏ qua" mặc định của update_attributes, đôi khi nó sẽ trả về true ngay cả khi một số khóa hoặc giá trị không hợp lệ được chuyển cho nó (hoặc nếu một số thuộc tính được bảo vệ hoặc chỉ đọc). Trong trường hợp này, đối tượng bạn có trong DOM khác với đối tượng thực sự trông như thế nào trong phần phụ trợ sau khi cập nhật. "Đầu: ok" có thể là OK, nhưng với mục đích thử nghiệm, tôi nghĩ rằng tôi có thể muốn có một bản sao của đối tượng thực sự sau khi cập nhật. – Buddy

Các vấn đề liên quan