`
liuqiang
  • 浏览: 159469 次
  • 性别: Icon_minigender_1
  • 来自: 华东
社区版块
存档分类
最新评论

在Ruby中设计Callback机制

    博客分类:
  • Ruby
阅读更多

阅读Paperclip源码,发现里面有一个不错的callback机制,如下:

 

def has_attached_file name, options = {}
      include InstanceMethods

      write_inheritable_attribute(:attachment_definitions, {}) if attachment_definitions.nil?
      attachment_definitions[name] = {:validations => []}.merge(options)

      after_save :save_attached_files
      before_destroy :destroy_attached_files

      define_paperclip_callbacks :post_process, :"#{name}_post_process"
      
      。。。。。。。
      
end

 

 

来看看define_paperclip_callbacks方法,在CallbackCompatability这个module中有定义:

 

module Rails3
      def self.included(base)
        base.extend(Defining)
        base.send(:include, Running)
      end

      module Defining
        def define_paperclip_callbacks(*callbacks)
          define_callbacks *[callbacks, {:terminator => "result == false"}].flatten
          callbacks.each do |callback|
            eval <<-end_callbacks
              def before_#{callback}(*args, &blk)
                set_callback(:#{callback}, :before, *args, &blk)
              end
              def after_#{callback}(*args, &blk)
                set_callback(:#{callback}, :after, *args, &blk)
              end
            end_callbacks
          end
        end
      end

      module Running
        def run_paperclip_callbacks(callback, opts = nil, &block)
          run_callbacks(callback, opts, &block)
        end
      end

 end
 

 

在看看set_callback是怎么被调用的

 

module Glue
    def self.included base #:nodoc:
      base.extend ClassMethods
      if base.respond_to?("set_callback")
        base.send :include, Paperclip::CallbackCompatability::Rails3
      else
        base.send :include, Paperclip::CallbackCompatability::Rails21
      end
    end
end
 

关键在于

run_callbacks(callback, opts, &block)

直接调用rails3的api,完毕后回调block,在block继续自己的业务逻辑

 

分享到:
评论

相关推荐

    android中的Handler和Callback机制.pdf

    Handler 和 Callback 机制是 Android 应用程序中的一种重要机制,用于在线程之间传递消息和通信。正确使用 Handler 可以提高应用程序的响应速度和效率,提高应用程序的灵活性和可扩展性。但是,需要注意 Handler 的...

    ASP.NET2.0实现无刷新客户端回调的Callback机制

    在ASP.NET 2.0中,引入了一种新的技术,即客户端回调(Client Callback)机制,也称为 Partial Page Rendering 或 UpdatePanel,这使得开发者能够实现无刷新页面更新,提高用户体验。 客户端回调机制的核心是通过...

    微软的CallBack机制

    微软的CallBack机制,只是了解了一下。不知道怎么实现复杂的功能,有时间网上查查,不知道有多少人在用。入门实例:http://blog.csdn.net/greatverve/archive/2008/12/23/3588353.aspx我的网址:www.0379zd.com

    VC++ CALLBACK

    在Microsoft Visual C++(简称VC++)编程中,回调函数是一种机制,允许我们传递一个函数作为参数给另一个函数,然后在需要的时候由这个接收函数调用我们传入的函数。这种功能在处理异步操作、事件驱动编程或者在库和...

    C++中回调函数(CallBack)的用法分析

    本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 其错误是普通的C++成员函数都隐含了一个传递...

    CallBack_DEMO 回调

    回调(Callback)是一种在软件设计模式中常见的编程概念,它允许一个函数或对象在完成某个操作后通知另一个函数或对象。在本示例"CallBack_DEMO"中,我们可能正在探讨如何在Java或其他编程语言中实现回调机制。回调...

    用友U9客户化开发 Callback & Postback 入门 v0.8

    在用友U9客户化开发中,Callback 是一个非常重要的技术。 Postback 则是一种提交表单的方式,通过POST请求将表单数据提交到服务器端。它可以实现页面的部分刷新,但与Callback 相比,Postback 需要刷新整个页面。 ...

    xe5(delphi)下在callback例子

    在这个“xe5(delphi)下在callback例子”中,我们可以通过查看源码和可执行文件来学习如何在Delphi XE5中应用回调机制。 首先,让我们了解什么是JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换...

    Callback数据类型转易语言子程序

    在编程领域,回调函数(Callback)是一种常见的设计模式,它允许我们将一个函数作为参数传递给另一个函数,以便在特定事件发生或某个操作完成后被调用。这种机制在异步编程和事件驱动编程中尤其重要。易语言,是中国...

    callBackExample

    回调(Callback)是一种在软件设计模式中常见的编程概念,它允许一个对象在完成特定操作后通知另一个对象。在Java或Android开发中,回调机制经常用于处理异步操作,例如网络请求、文件读写等,当操作完成时,通过回...

    回调技术(CallBack)源码

    回调技术(Callback)是软件设计模式中的一种,它在异步编程或事件驱动编程中扮演着重要角色。回调函数是一种代码执行模式,允许一个函数或方法在特定事件发生时被另一个函数调用。这种机制使得程序能够以非阻塞的...

    详解protobuf-c之在C语言中如何使用repeated生成数组和字符串(包含配置pb-callback-t)

    总结来说,protobuf-c在C语言中处理`repeated`字段时,提供了`pb_callback_t`这个机制,以适应动态大小的数据需求。理解并熟练运用`pb_callback_t`,可以让你更灵活地处理序列化和反序列化的复杂场景。通过编写...

    设计模式Callback介绍与实例

    回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。 java回调机制: 软件模块之间总是存在着一定的接口,从调用方式上,...

    Delphi DataSnap CallBack

    DataSnap CallBack机制允许服务器在执行某些操作后主动调用客户端的方法,将结果或事件通知给客户端。这个过程涉及到以下步骤: 1. **客户端注册回调**:客户端在调用服务器方法之前,需要在服务器上注册一个回调...

    VB各领域程序之Callback

    Callback机制允许一个函数或过程将另一个函数或过程的地址作为参数传递,然后在适当的时候由接收者调用这个传递的函数或过程。这种设计模式在各种编程领域都有广泛的应用,如事件处理、异步编程和用户自定义功能等。...

    xe7 CallBack

    "xe7 CallBack"可能指的是在Embarcadero Delphi xe7版本中使用的数据Snap(Datasnap)框架中的回调机制。数据Snap是Delphi提供的一个强大的服务器端开发框架,用于构建可扩展、高性能的分布式应用程序。 回调函数或...

    一个基于ajax+ASP.NET实现的客户端Callback 控件源码例子

    标题提到的“基于Ajax+ASP.NET实现的客户端Callback控件源码例子”是一个具体的示例,展示了如何在ASP.NET环境中使用Ajax技术来创建一个客户端回调功能。客户端回调(Client Callback)是ASP.NET提供的一种轻量级的...

    callback与callbout的区别 硬件工程师电路分析物联网模电单片机嵌入式技术.doc

    在物联网和硬件工程领域,尤其是涉及新能源汽车的嵌入式系统设计中,了解回调(callback)和呼叫出(callout)函数的概念及其应用至关重要。AUTOSAR(AUTomotive Open System ARchitecture)是一种开放的汽车行业软件...

    Activity_Callback.rar_Callback android_activity Callback_android

    在Android开发中,回调(Callback)机制是一种常用的设计模式,它允许一个对象在特定事件发生时通知另一个对象。在这个场景中,“Activity_Callback.rar_Callback android_activity Callback_android”标题提及的...

Global site tag (gtag.js) - Google Analytics