好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

rails3高端observer模式

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 紧密联在一起, ProductManagerObserver 来 ProductManager ,等等。如果你想有与你观察的类不同的名字的 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 将对 Accout 和 Balance ,它们约定的 record 的更新做出反应。  

 

 

二、利用回调方法  

 

 

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

 

 

三、存储 Observer 在 Rails 内  

 

 

如果你在 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 框架。

查看更多关于rails3高端observer模式的详细内容...

  阅读:42次

上一篇: rails lloop

下一篇:ruby语法不理解