Observer 的使用_Ruby_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > Ruby > Observer 的使用

Observer 的使用

 2010/11/17 22:56:57  a420144030  http://kennychen.javaeye.com  我要评论(0)
  • 摘要:声明:此帖抄录别人的原帖地址:http://www.javaeye.com/topic/508577Observer类会对外部的原始类内在生命周期内实现触发行为的“回调”做出反应。当一个“模型”类担负了不是它的核心职责的功能时,使用这种方式就会减少混乱。从上面说明中可以看出,Observer类是对Callbacks类的一种变相的补充。补充的原因是因为有些“模型”为了迁就Callbacks而做了自己不该做的事。而Observer类就是把原来要写在“模型”中的Callbacks的方法抽取出来
  • 标签:Observer的使用

声明:此帖抄录别人的

原帖地址:http://www.javaeye.com/topic/508577

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 框架。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

  • 相关文章
发表评论
用户名: 匿名