Skip to content

Instantly share code, notes, and snippets.

@kienbt01359
Last active May 22, 2018 07:29
Show Gist options
  • Save kienbt01359/6886972 to your computer and use it in GitHub Desktop.
Save kienbt01359/6886972 to your computer and use it in GitHub Desktop.

#Edge Rails: PATCH là phương thức HTTP cơ bản mới dùng khi cập nhật dữ liệu. ##PATCH là gì? Phương thức HTTP PUT nghĩa là sự tạo mới hoặc thay thế resource tại URL nào đó được đưa ra. Ví dụ, nếu bạn upload 1 file lên S3 tại URL nào đó mà bạn muốn hoặc là tạo mới file hoặc là thay thế 1 file có sẵn (nếu có). Đó gọi là PUT.
Bây giờ hãy nói về 1 ứng dụng Web có 1 model tên là Invoice(hóa đơn) với một cờ trạng thái paid để tìm ra những hóa đơn nào đã đã được thanh toán. Làm thế nào để bạn thiết lập flag trong phương pháp RESTful? Gửi paid = 1 qua PUT tới /invoices/:id thì sẽ không phù hợp với ngữ nghĩa của HTTP, bởi vì những loại request này sẽ không được gửi 1 biểu diễn toàn diện của invoice để cho sự thay thế.

Với sự ràng buộc của các phương thức GET, PUT, POST, DELETE, câu trả lời muôn thuở đó là xác định cờ trạng thái paid của những invoice đã đưa ra để trở thành resource bởi chính nó(tức là định nghĩa cờ trạng thái paid thành một resource riêng, và là một phần của). Cho nên, bạn định nghĩa 1 route để có thể PUT paid=1 tới /invoices/:id/paid. Bạn phải làm điều này bởi vì PUT không cho phép cập nhập một phần của resource.
Bây giờ, hãy nghĩ đến form edit thường dùng trong những ứng dụng Ruby on Rails điển hình. Có bao nhiêu lần chúng ta gửi 1 biểu diễn toàn diện để thực hiện việc thay thế? Không thường xuyên, có lẽ chúng ta có thể nói rằng hiếm khi chúng ta làm như vậy trong thực tiễn.
Ví dụ 2 nhãn thời gian created_atupdated_at thông thường không thể được thiết lập bởi người dùng cuối, mặc dù chúng được coi là thuộc về sự biểu diễn của các resources để nối với các bản ghi.

PUT ngoài ra còn là 1 phương thức idempotent. Bạn có thể xem lại 1 request bao nhiều lần bạn muốn và trả về cùng một resource, có một thứ gì đó mà thỉnh thoảng vi phạm bởi các thành ngữ quy ước để tạo ra những resource con sử dụng nested attributes khi cập nhật resource cha.

Trên lý thuyết, không có gì ngăn chặn PUT thực hiện việc cập nhật, nhưng khi HTTP đã được chuẩn hóa ngữ nghĩa, sự thay thế đã được triển khai.

Vì điều đó, phương thức PATCH được định nghĩa vào năm 1995 và trở thành chuẩn sau đó. PATCH là một phương thức không an toàn hay không idempotent và cho phép cập nhập đầy đủ và một phần và có tác dụng phụ lên các resource khác.

Trong thực tiễn, như các bạn thấy răng, PATCH phù hợp với cách lập trình Web hiện tại hơn PUT trong việc cập nhật các resources. Trong Ruby on Rails, nó tương ứng một cách tự nhiên với cách chúng ta sử dụng update_attributes để cập nhật các bản ghi.
Vì vậy cho nên, PATCH đang trở thành phương thức căn bản cho việc cập nhật dữ liệu trong Rails 4.0 ##Routing Đây là 1 sự thay đổi quan trọng, nhưng chúng tôi có kế hoạch làm việc đó trong một cách gọi là tương thích ngược.
Khi một resource được khai báo trong confing/routes.rb, ví dụ:
resource :users
Thì action trong UserController để cập nhật 1 user vẫn là update trong Rails 4.0. PUT request tới /users/:id trong Rails 4.0 lấy đường dẫn tới update giống như nó bây giờ. Vì vậy, nếu bạn có 1 API mà lấy PUT request thực thì nó vẫn hoạt động.
Trong Rails 4.0, điều hướng hướng PATCH request tới /users/:id tới update action.
Như vậy, trong Rails 4.0, cả PUT và PATCH đều được điều hướng tới update ##Forms Form của những resources tồn tại: form_for @user Lấy patch trong hidden_field _method. RFC thì không rõ ràng về cách để mô tả những sự thay đổi trong 1 PATCH request.
Gửi 1 form là hoàn toàn hợp lệ, client và server phải chấp nhận một cách đơn giản cái cách để cập nhật 1 resource. Hãy để tôi nhấn mạnh rằng _method hack(trick) là 1 giải pháp tạm thời cho sự giới hạn trong trình duyệt web. Giống như bạn hầu như chắc chắn biết rằng Rails định tuyến những phương thức HTTP thực.
Đó ắt hằn PUT, DELETE và bây giờ, PATCH requests được điều hướng tới những actions tương ứng. ##General availability PATCH request thì hiện đang tồn tại trên mọi nơi mà toàn bộ phương thức còn lại tồn tại bây giờ. Có một patch macro để điều hướng DSL, :via hiểu ký hiệu :patch. Việc kiểm thử có thể chỉ ra PATCH requests, yêu cầu đối tượng respond tới patch?.v.v.. Hãy xem commit gốc để biết thêm chi tiết (với 1 bài followup quan trọng ở đây) ##Will my web server understand PATCH? Đương nhiêu là có thể rồi. Cá nhân tôi đã thử Apache, nginx, Phusion Passenger, Unicorn, Thin và WEBrick. Tất cả đều hiểu PATCH requests 1 cách thông minh. Cũng như vậy, HTTP clients có thể đưa ra yêu câu chung với PATCH requests. Ví dụ trong curl(1), bạn thực thi: curl -d'user[name]=wadus' -X PATCH http://localhost:3000/users/1 ##Credits Chúng tôi xin cảm ơn David Lee vì sự đóng góp này và sự kiên trì vô tận để giữ sự quan tâm đến vấn đề này dù sau nhiều tháng thảo luận
Ngoài ra tôi muốn làm nổi bật chất lượng của các bản vá chính nó. Thật là tuyệt vời: code, kiểm thử, tất cả các tài liệu sửa đổi, comment code.
Tất cả mọi thứ một cách cẩn thận và kỹ lưỡng cập nhật. Đây là một miếng vá mẫu mực ##References http://weblog.rubyonrails.org/2012/2/25/edge-rails-patch-is-the-new-primary-http-method-for-updates/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment