回调是在对象在运行的时候会自动关联的钩子,很典型的使用方法是在父类提供一组与其功能相关的一组回调,子类在可以增加一些功能在父类的方法上,而不需要重写父类的方法,这样也保护了父类的方法的整洁性,而不被破坏
一般我们在model中经常会使用 这种callbacks方法
如:before_save after_save before_destroy 等这样的都是,这样既不用 去重写 save destroy 方法,也能去改变或者实现一些功能
如果真的没有办法 非要去修改,建议也是 用 module 来规范作用域,然后去修改,不要污染其他的作用域
如:
module A
refine String do
def add2
self*2
end
end
end
module B
using A
"a".add2
end
end
这样在使用的时候就不会污染全局了
那么 使用ActiveSupport::Callbacks 怎么来定义自己的 callback
class Record
include ActiveSupport::Callbacks
define_callbacks :save
def save
run_callbacks :save do
puts "- save"
end
end
end
class PersonRecord < Record
set_callback :save, :before, :saving_message
def saving_message
puts "saving..."
end
set_callback :save, :after do |object|
puts "saved"
end
end
person = PersonRecord.new
person.save
输出
saving...
- save
saved
- save
saved
我们来看 首先我们需要做的一件事情是 父类的 Record 有一个 save 方法 ,我们 可能在子类中需要调用这个save方法,并且能不使用 打开类的方法重新save方法 来 给save方法增加一些功能
声明 define_callbacks :save
在调用save方法的时候 先检查它的 callback, run_callbacks :save
set_callback save方法回调执行的具体内容
如 after 是在 调用save方法之后 需要执行的内容
before 是在调用之前需要执行的内容