Skip to content

Latest commit

 

History

History
37 lines (26 loc) · 2.18 KB

updating-only-changed-dirty-attributes.md

File metadata and controls

37 lines (26 loc) · 2.18 KB

Flexirest: Updating only changed/dirty attributes

The most common RESTful usage of the PATCH http-method is to only send fields that have changed. The default action for all calls is to send all known object attributes for POST/PUT/PATCH calls, but this can be altered by setting the only_changed option on your call declaration.

class Person < Flexirest::Base
  get :all, '/people'
  patch :update, '/people/:id', :only_changed => true # only send attributes that are changed/dirty
end

person = Person.all.first
person.first_name = 'Billy'
person.update # performs a PATCH request, sending only the now changed 'first_name' attribute

This functionality is per-call, and there is some additional flexibility to control which attributes are sent and when.

class Person < Flexirest::Base
  get :all, '/people'
  patch :update_1, '/people/:id', :only_changed => true # only send attributes that are changed/dirty (all known attributes on this object are subject to evaluation)�
  patch :update_2, "/people/:id", :only_changed => [:first_name, :last_name, :dob] # only send these listed attributes, and only if they are changed/dirty
  patch :update_3, "/people/:id", :only_changed => {first_name: true, last_name: true, dob: false} # include the listed attributes marked 'true' only when changed; attributes marked 'false' are always included (changed or not, and if not present will be sent as nil); unspecified attributes are never sent
end

Additional Notes:

  • The above examples specifically showed PATCH methods, but this is also available for POST and PUT methods for flexibility purposes (even though they break typical REST methodology).

  • This logic is currently evaluated before Required Parameters, so it is possible to ensure that requirements are met by some clever usage.

    • This means that if a method is :requires => [:active], :only_changed => {active: false} then active will always have a value and would always pass the :requires directive (so you need to be very careful because the answer may end up being nil if you didn't specifically set it).

< Required parameters | HTTP/parse error handling >