zoukankan      html  css  js  c++  java
  • rails3高端observer模式

    ActiveRecord::Observer

    Observer类会对外部的原始类内在生命周期内实现触发行为的“回调”做出反应。当一个“模型”类担负了不是它的核心职责的功能时,使用这种方式就会减少混乱。 

     

    从上面说明中可以看出,Observer类是对Callbacks类的一种变相的补充。补充的原因是因为有些“模型”为了迁就Callbacks而做了自己不该做的事。而Observer类就是把原来要写在“模型”中的Callbacks的方法抽取出来,并在类中指出它要监视这个“模型”对象与Callbacks有关的活动。 

     

    Observer允许你注入行为到“模型”类中,而不用修改这些类内的任何代码。 

     

    一个“观察者”显示地连接本身到一个“模型”类中,为了回调注册它自己为“模型”的一部分,但是并不要求“模型”本身做任何更改。 

     

    例如: 

     

    class CommentObserver < ActiveRecord::Observer

     

    def after_save(comment)

     

    Notifications.deliver_comment("admin@do.com",

     

    "New comment was posted", comment)

     

    end

     

    end

     

     

    Comment#save执行完成时,这个Observer发送一个电子邮件。 

     

    class ContactObserver < ActiveRecord::Observer

     

    def after_create(contact)

     

    contact.logger.info('New contact added!')

     

    end

     

    def after_destroy(contact)

     

    contact.logger.warn("Contact with an id

     

    of #{contact.id} was destroyed!")

     

    end

     

    end

     

     

    这个Observer在指定的回调被触发时,使用logger来日志。 

     

    ActiveRecord::Observer 被子类化时,它查看新类名字,从尾部剥去单词Observer,并且假设左侧是被观察的“模型”类的名字。在我们的例子中,我们称我们的“观察者”类为ContactObserver ,所以它自动地把它自己同“模型”Contact钩住。 

     

     

    一、观察不能被推断的类 

     

     

    缺省地,Observer映射与其共享同一名字的类。所以CommentObserver会与“观察者”Comment紧密联在一起,ProductManagerObserverProductManager,等等。如果你想有与你观察的类不同的名字的Observer,你可以使用Observer.observe类方法。 

     

    也就是说,Observer类可以使用observer()方法明确地列出了它想观察的“模型”。 

     

    class AuditObserver < ActiveRecord::Observer

     

    observe Account

     

     

    def after_update(account)

     

    AuditTrail.new(account, "UPDATED")

     

    end

     

    end

     

     

    如果audit“观察者”需要观察多个种类的对象,这可以指定多个参数: 

     

    class AuditObserver < ActiveRecord::Observer

     

    observe Account, Balance

     

     

    def after_update(record)

     

    AuditTrail.new(record, "UPDATED")

     

    end

     

    end

     

     

    现在,AuditObserver将对AccoutBalance,它们约定的record的更新做出反应。 

     

     

    二、利用回调方法 

     

     

    Observer可以为Callbacks模块内描述的每个方法实现回调方法。 

     

     

    三、存储ObserverRails 

     

     

    如果你在Rails内使用了“活动记录”,则Observer类通常以app/models/audit_observer.rb名字约定被存储在app/models目录内。 

     

     

    四、配置 

     

     

    为了激活一个Observer,你需要在config/environment.rb文件内设置config.active_record.observers配置。 

     

    config.active_record.observers = :comment_observer,

     

    :signup_observer

     

     

    除非你在你的应用程序配置中定义这些,否则Observer将不会被调用。 

     

    也就是说,我们必须创建一个“观察者”实例—只定义“观察者”类是不能完成观察的。对标准的“活动记录”应用程序来说,你还需要在初始化期间,在某些方便的地方调用instance()方法。如果你写一个Rails应用程序,你将在你的ApplicationController内使用observer指令, 

     

    五、Observer 生成器 

     

     

    在提示符窗口输入script/generate observer User,可以在app/models目录下创建一个UserObserver框架。

  • 相关阅读:
    【JAVA笔记——术】java枚举类使用
    【JAVA笔记——术】java枚举类使用
    【JAVA笔记——道】JAVA 基本类型内存探究
    【JAVA笔记——道】JAVA 基本类型内存探究
    【JAVA笔记——道】Hibernate 线程本地化基础篇
    Java实现HTML转PDF的总结
    JqGrid使用经验
    C# 保留小数点后两位(方法总结)
    SQL SERVER表不能修改表结构的处理方法
    C# DLL文件注册问题(涉及AxInterop.WMPLib.dll等)
  • 原文地址:https://www.cnblogs.com/lexus/p/1866308.html
Copyright © 2011-2022 走看看