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