Ruby on Rails 5.2 - ActiveModel::Callbacks

मॉड्यूल ActiveModel :: कॉलबैक




ruby

मॉड्यूल ActiveModel :: कॉलबैक

शामिल मॉड्यूल:
ActiveSupport::Callbacks

सक्रिय मॉडल कॉलबैक

कॉलबैक जैसे सक्रिय रिकॉर्ड के लिए किसी भी वर्ग के लिए एक इंटरफ़ेस प्रदान करता है।

सक्रिय रिकॉर्ड विधियों की तरह, कॉलबैक श्रृंखला को छोड़ दिया जाता है जैसे ही कोई विधि फेंकता है :abort

सबसे पहले, ActiveModel::Callbacks विस्तार करें ActiveModel::Callbacks जा रहे वर्ग से ActiveModel::Callbacks :

class MyModel
  extend ActiveModel::Callbacks
end

फिर उन तरीकों की एक सूची परिभाषित करें जिन्हें आप चाहते हैं:

define_model_callbacks :create, :update

यह दोनों :create और :update विधियों के लिए सभी तीन मानक कॉलबैक (पहले, आसपास और बाद में) प्रदान करेगा। लागू करने के लिए, आपको उन विधियों को लपेटना होगा जिन्हें आप किसी ब्लॉक में कॉलबैक चाहते हैं ताकि कॉलबैक को आग लगाने का मौका मिले:

def create
  run_callbacks :create do
    # Your create action methods here
  end
end

फिर अपनी कक्षा में, आप पहले से before_create के before_create , around_create तैयार, after_create और around_create विधियों का उपयोग कर सकते हैं।

before_create :action_before_create

def action_before_create
  # Your code here
end

कॉलबैक को परिभाषित करने के दौरान ब्लॉक पर जाना याद रखें, अन्यथा इसे निष्पादित नहीं किया जाएगा:

around_create :log_status

def log_status
  puts 'going to call the block...'
  yield
  puts 'block successfully called.'
end

आप define_model_callbacks विधि के लिए एक हैश पास करके केवल विशिष्ट कॉलबैक चुन सकते हैं।

define_model_callbacks :create, only: [:after, :before]

केवल अपनी कक्षा में after_create और before_create कॉलबैक विधियाँ before_create

नोट: एक ही कॉलबैक को कई बार कॉल करने से पिछली कॉलबैक परिभाषाएँ ओवरराइट हो जाएंगी।

सार्वजनिक प्रवृत्ति के तरीके

define_model_callbacks (* कॉलबैक) शो स्रोत
# File activemodel/lib/active_model/callbacks.rb, line 108
def define_model_callbacks(*callbacks)
  options = callbacks.extract_options!
  options = {
    skip_after_callbacks_if_terminated: true,
    scope: [:kind, :name],
    only: [:before, :around, :after]
  }.merge!(options)

  types = Array(options.delete(:only))

  callbacks.each do |callback|
    define_callbacks(callback, options)

    types.each do |type|
      send("_define_#{type}_model_callback", self, callback)
    end
  end
end

#define_model_callbacks एक ही विकल्प को स्वीकार करता है जो #define_model_callbacks करता है कि क्या आप डिफ़ॉल्ट को ओवरराइट करना चाहते हैं। इसके अलावा, यह भी :only एक :only विकल्प स्वीकार करता है, जहां आप चुन सकते हैं कि आप सभी प्रकार (पहले, आसपास या बाद में) चाहते हैं या कुछ।

define_model_callbacks :initializer, only: :after

ध्यान दें, only: <type> हैश उस पद्धति कॉल पर परिभाषित सभी कॉलबैक पर लागू होगा। इसके आस-पास पाने के लिए आप #define_model_callbacks विधि को जितनी बार #define_model_callbacks कॉल कर सकते हैं।

define_model_callbacks :create,  only: :after
define_model_callbacks :update,  only: :before
define_model_callbacks :destroy, only: :around

around_destroy , around_destroy और around_destroy विधियों को ही around_destroy

आप कक्षा में पहले__ प्रकार>, बाद_ <प्रकार> और आसपास_ <प्रकार> पास कर सकते हैं, जिस स्थिति में कॉलबैक उस कक्षा की <कार्रवाई> _ <प्रकार> विधि को कॉल करता है जो कॉलबैक कहा जा रहा है।

class MyModel
  extend ActiveModel::Callbacks
  define_model_callbacks :create

  before_create AnotherClass
end

class AnotherClass
  def self.before_create( obj )
    # obj is the MyModel instance that the callback is being called on
  end
end

ध्यान दें: method_name #define_model_callbacks को पास नहीं होना चाहिए ! ? या =