Custom Rails Callback
Join the DZone community and get the full member experience.Join For Free
// This shows you how to extend active record to allow a custom callback.
#ever needed to add your own callback into the active record callback chain? #here's how... module ActiveRecord #to keep things clean we'll define our own module module SweetCustomCallbacks #this is the ruby method that is called when you call include on a module #the method passed, base in our case, is the class your including yourself in def self.included(base) #this clas_eval method takes a block that will be added to base, which is ActiveRecord::Base #basically this is like writing code directly into the class ActiveRecord::Base base.class_eval do #alias_method_chain is very cool #it allows us override a method without removing the original and without the original knowing its been changed #here's how it works: # 1st argument is the name of the method you're overriding # 2nd argument is feature you want to add # so if create_or_update is called it will actually call create_or_update_with_sweet_custom_callbacks # the original is still avaliable at create_or_update_without_custom_callbacks alias_method_chain :create_or_update, :sweet_custom_callbacks #the method create_or_update is an internals method to ActiveRecord that is called whenever you call .save or .update #this is the class method that allows the cool syntax: # class Article < ActiveRecord::Base # before_before_save :add_authors_name #private #def add_authors_name #..... def self.before_before_save(*callbacks, &block) callbacks << block if block_given? #add the block to the array of callback functions if a block was passed write_inheritable_array(:before_before_save,callbacks) end end end #the instance method, although not recomended is avaliable for overriding #also if you wanted to have a callback that always did something say add the users's id to the object #you could always code that in here and remove the class above def before_before_save() end #ok this is the method that is now called instead of create_or_update #it calls a method callback on def create_or_update_with_sweet_custom_callbacks return false if callback(:before_before_save) == false #this method does all the real work and calls the callback function in callbacks.rb that gets the methods and runs them create_or_update_without_sweet_custom_callbacks end end class Base include SweetCustomCallbacks #include our module in ActiveRecord::Base end end
Opinions expressed by DZone contributors are their own.
Managing Data Residency, the Demo
What Is mTLS? How To Implement It With Istio
Building and Deploying Microservices With Spring Boot and Docker
Building A Log Analytics Solution 10 Times More Cost-Effective Than Elasticsearch