`
liuqiang
  • 浏览: 161928 次
  • 性别: 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

    callback机制

    2. **声明接口对象**:在一个类中声明一个上述接口类型的对象,例如在类`Caller`中声明一个`Callback`类型的对象`mCallback`。 ```java public class Caller { private Callback mCallback; // ...其他代码 } ...

    VC++ CALLBACK

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

    Callback

    在IT行业中,回调(Callback)是一种常见的编程技术,特别...这个项目为学习和实践C#中的服务程序开发、回调机制以及进程间通信提供了一个实际示例,对于提升开发者在系统级编程和分布式系统设计方面的技能非常有价值。

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

    【Java 设计模式-源码】Callback 模式:掌握异步通信

    在 Java 开发中,Callback 模式是一种重要的设计模式,用于处理异步通信和事件处理。本文将详细介绍 Callback 模式的意图、解释、编程示例、适用场景、实际应用、优点和权衡。同时,还将提供示例代码的下载链接,...

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

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

    设计模式Callback介绍与实例

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

    VC/C#调用delphi写的dll, 演示如何进行类的传递并callback调用方的代码

    本示例中,我们将探讨如何在VC中调用由Delphi编写的动态链接库(DLL),特别是涉及到类的传递以及回调(callback)机制。在Delphi中创建DLL,然后在VC或C#中调用,可以利用Delphi的强大面向对象特性,并将其集成到...

    Delphi DataSnap CallBack

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

    VB各领域程序之Callback

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

Global site tag (gtag.js) - Google Analytics