阅读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继续自己的业务逻辑
分享到:
相关推荐
Carlson撰写,黄健宏翻译,旨在深入剖析Redis的设计与实现,并提供多种语言(Java、Python、Ruby、Node.js)的源码示例,帮助读者理解如何在实际项目中应用Redis。 Redis以其丰富的数据结构(如字符串、哈希、列表...
例如,Rails中的Callback方法允许在特定的动作执行前后插入自定义的代码,而Rendering方法则用于向用户返回动态生成的HTML内容。 Rails中的Middleware(中间件)机制是构建在Rack之上的。Rack为Ruby Web应用提供了...
- 了解 GDK 事件的结构对于理解 GTK 中的事件传递机制至关重要。 - **GTK 事件处理函数** - 开发者可以编写事件处理函数来响应特定的 GDK 事件。 - **事件掩码(Event Mask)** - 事件掩码用于控制 GTK 组件应该...
在Crystal这个静态类型的Ruby-like编程语言中,CrystGLFW提供了方便、简洁且符合Crystal语法习惯的API,让开发者能够更加高效地构建基于OpenGL的应用。 首先,我们来了解一下GLFW的核心功能。GLFW允许程序员创建和...