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
框架。
分享到:
- 2009-11-02 13:58
- 浏览 934
- 评论(0)
- 论坛回复 / 浏览 (0 / 2907)
- 查看更多
相关推荐
Sortiri是一种干净轻巧的解决方案,用于使ActiveRecord :: Base对象可排序。 描述Sortiri是一种干净轻巧的解决方案,用于使ActiveRecord :: Base对象可排序。 入门Ruby 2.6.0和更高版本上的ActiveRecord 4.2+支持...
主动记录一种轻松使用ActiveRecord的简便方法。 可与Grape,Sinatra,普通的旧机架甚至是无聊的小脚本一起使用!。 默认值都是非常Railsy的( config/database.yml , db/seeds.rb , db/migrate等),但是您可以...
在创建一个ActiveRecord模型时,通常会定义一个继承自`ActiveRecord::Base`的类。例如,如果我们有一个`users`表,我们可以创建一个`User`类: ```ruby class User < ActiveRecord::Base end ``` 这个简单的定义就...
stateful_enum是建立在ActiveRecord的内置ActiveRecord :: Enum之上的状态机gem。 安装 将此行添加到您的Rails应用程序的Gemfile中: gem 'stateful_enum' 和捆绑。 动机 您不需要抽象 stateful_enum取决于...
RailsAsyncMigrations ActiveRecord::Migration扩展程序以一种简单直接的方式使您的迁移异步。动机创建该库的目的是为了帮助在技术水平上难以扩展的小型公司。 小型项目不需要异步迁移队列,大公司在遇到扩展问题时...
ActiveRecord :: Jwt 此ActiveRecord扩展添加了jwt(JSON Web Token)方法 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-jwt' 然后执行: $ bundle 或将其自己安装为: $ gem install ...
userstamp, 这个 Rails 插件扩展ActiveRecord Userstamp插件( v-2.0 )概述Userstamp插件扩展了 ActiveRecord::Base,以添加对'创建者','更新程序'和'deleter'属性的自动更新。 它是基于 ActiveRecord::Timesta
丝瓜络活动记录 地位系统地位大堂CI 代码气候 版眼描述loofah-activerecord将loofahHTML清理功能扩展到Rails ActiveRecord模型中。 在以下查看有关loofah更多信息: : 特征丝瓜络activerecord包含两个ActiveRecord...
RGeo :: ActiveRecord是一个可选的模块,它为ActiveRecord提供空间扩展,以及一组用于基于RGeo编写空间ActiveRecord适配器的帮助程序。 概括 RGeo是使用Ruby编程语言编写位置感知应用程序的关键组件。 其核心是行业...
ActiveRecord :: Commentator ActiveRecord :: Commentator将caller_location (文件名,行号和方法名)添加为调用SQL语句SQL注释。 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-commentator'...
什么是ActiveRecord的简要概述: 活动记录是一种访问数据库中数据的方法。 数据库表或视图被包装到一个类中,因此对象实例被绑定到表中的一行。 创建对象后,保存后会将新行添加到表中。 任何加载的对象都从数据库...
WordPress ActiveRecord WordPress ActiveRecord 实现了可以轻松地检索、更新和删除数据库表的行,而无需费力处理原始 SQL 查询字符串。 这个库的目标是为 CMS WordPress 提供一个小而强大的 ,它应该很容易实现。 ...
ActiveRecord::ConnectionAdapters::ConnectionManagement ActiveRecord::QueryCache ActionDispatch::Cookies ActionDispatch::Session::CookieStore ActionDispatch::Flash ActionDispatch::ParamsParser ...
最好将ActiveRecord::Collection描述为介于模型(从ActiveRecord::Base扩展而来)、 ActiveRecord::Relation和可枚举的记录集之间的某处。 集合包装并委托给上述对象,在需要时(并且尽可能不频繁地)在发送方法调用...
5.0 > ActiveRecord::VERSION >= 3.2 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-mysql-unsigned' 然后执行: $ bundle 或将其自己安装为: $ gem install activerecord-mysql-unsigned ...
neo4apis-activerecord 将数据从PostgreSQL / mySQL / sqlite复制到Neo4j的最简单,最快的方法 如何运行: 没有现有的ActiveRecord应用程序: neo4apis activerecord all_tables --identify-model --import-all-...
Scala ActiveRecord scala-activerecord是Scala的ORM库。 该库的灵感来自Ruby on Rails的ActiveRecord。 它是按照CoC(配置公约),DRY(请勿重复自己)的原则设计的。 最小的例子 样本片段: 模型实施: ...
ActiveRecord :: TypedStore 但具有类型化的属性。 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-typedstore' 然后执行: $ bundle 或将其自己安装为: $ gem install activerecord-...
Swift 的活动记录 操作核心数据的简单方法。 该库的灵感来自活动记录模式,这是一种易于操作数据库的设计模式。 要求 Xcode 6.3 ...ActiveRecord需要包含NSManagedObjectContext Context ,以便在
ActiveRecord :: Base has_many :comments end class Comment < ActiveRecord :: Base belongs_to :article end 然后,您通常需要将Comment内容反规范化为Post ,反之亦然。 这是在帖子上反规范last_comment_...