`
liuqiang
  • 浏览: 164356 次
  • 性别: 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继续自己的业务逻辑

 

分享到:
评论

相关推荐

    Redis 实战 源码(java python ruby node)(缺少第三节)

    Carlson撰写,黄健宏翻译,旨在深入剖析Redis的设计与实现,并提供多种语言(Java、Python、Ruby、Node.js)的源码示例,帮助读者理解如何在实际项目中应用Redis。 Redis以其丰富的数据结构(如字符串、哈希、列表...

    rails-beginner-s-guide

    例如,Rails中的Callback方法允许在特定的动作执行前后插入自定义的代码,而Rendering方法则用于向用户返回动态生成的HTML内容。 Rails中的Middleware(中间件)机制是构建在Rack之上的。Rack为Ruby Web应用提供了...

    GTK学习笔记(简体中文版)

    - 了解 GDK 事件的结构对于理解 GTK 中的事件传递机制至关重要。 - **GTK 事件处理函数** - 开发者可以编写事件处理函数来响应特定的 GDK 事件。 - **事件掩码(Event Mask)** - 事件掩码用于控制 GTK 组件应该...

    CrystGLFW:Crystal中GLFW的面向对象的API

    在Crystal这个静态类型的Ruby-like编程语言中,CrystGLFW提供了方便、简洁且符合Crystal语法习惯的API,让开发者能够更加高效地构建基于OpenGL的应用。 首先,我们来了解一下GLFW的核心功能。GLFW允许程序员创建和...

Global site tag (gtag.js) - Google Analytics