读《应用rails进行敏捷web开发》第2版-10

p362

 

ActiveRecord

 

在模型层对数据进行校验

validate

validate_on_create

validate_on_update

这3个方法可以再试图持久化(save)或任何时候(valid?)进行调用。

 

在校验出错时,可以

errors.add(:email,"xxxx")

errors.add_to_base("xxxx")

可以使用下面来得到指定字段的相关错误

errors[:email]或errors.on[:email]

 

 

validates_associated用于检验关联对象

注意不要在两个互相关联的对象同时定义validates_associated,否则可能会互相校验出错,导致溢出

 

rails 规定凡是后缀为_confirmation的字段,可以使用validates_confirmation_of来校验保证两者一致,比如第二遍密码

 

ActiveRecord的回调

相当于事件处理器,共有20个事件,其中18个成对(before_xxx,after_xxx)

有几种方法来控制

1.直接override,

2.用方法回调

3.用代码块回调,传入当前模型对象

 

可以挂接多个方法,按照声明顺序执行,并在中途被截断,如果该方法返回false

 

例外:after_find,after_initialize不能使用上述第3种方法

 

上面都是在模型对象内部定义回调方法,也可以专门定义一个处理器类,用于多个模型对象共享。

处理器类放在app/model目录,定义上述20个回调函数均可,用于让模型对象调用。

回调函数的定义应该和模型对象一致,传入一个参数——模型对象

 

 

如何调用处理器类为模型对象服务,如同模型对象的第2中方法,挂接方法一样,只不过换成了处理器类的实例

before_validation :MyHandler.new

 

假设这个处理器类的各个方法都做的同样的事情,比如加密,解密

那么可以只写一个代码段,其他全用别名,恩,这个做法很聪明。

alias_method :after_find,:after_save

 

对于after_find,after_initialize,必须在模型类中定义一个空方法,否则其挂接的共享处理器类不回起作用。

 

到处都是魔术,这样也算定义了一个方法!!

def xxx

  。。。

  define_method(:after_find){}

end

 

 

Observer观察者模式,主要解决什么问题?

让模型对象干自己的事情,记日志这种事情应该专门的类来做,而不是每个模型对象放入一大堆写日志的代码。

在很久很久以前,曾经看过spring的相关东西,好像这也属于AOP的活儿。

 

rails命名魔法

class OrderObserver <ActiveRecord::Observer

end

去掉后面的Observer,剩下的Order就是这个观察者类监控的模型类。

其中也是定义上述20个处理器进行监控

 

也可以自定义声明,观察哪些类

observe :Order,:Product

 

在观察者类定义的最后要加上实例化代码——调用instance方法

class OrderObserver <ActiveRecord::Observer

  ...

end

OrderObserver.instance

 

可以在控制器代码中可以使用observer指令申明

class SomeController<ApplicationController

  observer :stock_observer

 

果然,书中提到了这也算是AOP

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值