阅读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继续自己的业务逻辑
分享到:
相关推荐
Handler 和 Callback 机制是 Android 应用程序中的一种重要机制,用于在线程之间传递消息和通信。正确使用 Handler 可以提高应用程序的响应速度和效率,提高应用程序的灵活性和可扩展性。但是,需要注意 Handler 的...
在ASP.NET 2.0中,引入了一种新的技术,即客户端回调(Client Callback)机制,也称为 Partial Page Rendering 或 UpdatePanel,这使得开发者能够实现无刷新页面更新,提高用户体验。 客户端回调机制的核心是通过...
微软的CallBack机制,只是了解了一下。不知道怎么实现复杂的功能,有时间网上查查,不知道有多少人在用。入门实例:http://blog.csdn.net/greatverve/archive/2008/12/23/3588353.aspx我的网址:www.0379zd.com
2. **声明接口对象**:在一个类中声明一个上述接口类型的对象,例如在类`Caller`中声明一个`Callback`类型的对象`mCallback`。 ```java public class Caller { private Callback mCallback; // ...其他代码 } ...
在Microsoft Visual C++(简称VC++)编程中,回调函数是一种机制,允许我们传递一个函数作为参数给另一个函数,然后在需要的时候由这个接收函数调用我们传入的函数。这种功能在处理异步操作、事件驱动编程或者在库和...
在IT行业中,回调(Callback)是一种常见的编程技术,特别...这个项目为学习和实践C#中的服务程序开发、回调机制以及进程间通信提供了一个实际示例,对于提升开发者在系统级编程和分布式系统设计方面的技能非常有价值。
本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 其错误是普通的C++成员函数都隐含了一个传递...
回调(Callback)是一种在软件设计模式中常见的编程概念,它允许一个函数或对象在完成某个操作后通知另一个函数或对象。在本示例"CallBack_DEMO"中,我们可能正在探讨如何在Java或其他编程语言中实现回调机制。回调...
总结来说,protobuf-c在C语言中处理`repeated`字段时,提供了`pb_callback_t`这个机制,以适应动态大小的数据需求。理解并熟练运用`pb_callback_t`,可以让你更灵活地处理序列化和反序列化的复杂场景。通过编写...
在用友U9客户化开发中,Callback 是一个非常重要的技术。 Postback 则是一种提交表单的方式,通过POST请求将表单数据提交到服务器端。它可以实现页面的部分刷新,但与Callback 相比,Postback 需要刷新整个页面。 ...
通过上述模板化的实现方式,我们可以更加灵活地在C++程序中使用回调机制。这种方式不仅提高了代码的安全性,还增强了代码的可读性和可扩展性,使得回调功能在复杂的应用场景下变得更加可靠和高效。无论是处理复杂的...
在这个“xe5(delphi)下在callback例子”中,我们可以通过查看源码和可执行文件来学习如何在Delphi XE5中应用回调机制。 首先,让我们了解什么是JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换...
在编程领域,回调函数(Callback)是一种常见的设计模式,它允许我们将一个函数作为参数传递给另一个函数,以便在特定事件发生或某个操作完成后被调用。这种机制在异步编程和事件驱动编程中尤其重要。易语言,是中国...
回调(Callback)是一种在软件设计模式中常见的编程概念,它允许一个对象在完成特定操作后通知另一个对象。在Java或Android开发中,回调机制经常用于处理异步操作,例如网络请求、文件读写等,当操作完成时,通过回...
回调技术(Callback)是软件设计模式中的一种,它在异步编程或事件驱动编程中扮演着重要角色。回调函数是一种代码执行模式,允许一个函数或方法在特定事件发生时被另一个函数调用。这种机制使得程序能够以非阻塞的...
在 Java 开发中,Callback 模式是一种重要的设计模式,用于处理异步通信和事件处理。本文将详细介绍 Callback 模式的意图、解释、编程示例、适用场景、实际应用、优点和权衡。同时,还将提供示例代码的下载链接,...
回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。 java回调机制: 软件模块之间总是存在着一定的接口,从调用方式上,...
本示例中,我们将探讨如何在VC中调用由Delphi编写的动态链接库(DLL),特别是涉及到类的传递以及回调(callback)机制。在Delphi中创建DLL,然后在VC或C#中调用,可以利用Delphi的强大面向对象特性,并将其集成到...
DataSnap CallBack机制允许服务器在执行某些操作后主动调用客户端的方法,将结果或事件通知给客户端。这个过程涉及到以下步骤: 1. **客户端注册回调**:客户端在调用服务器方法之前,需要在服务器上注册一个回调...