# 1 宏定义的方式,后面跟方法名进行调用
class Topic < ActiveRecord::Base
before_destroy :delete_parents
private
def delete_parents
self.class.delete_all "parent_id = #{id}"
end
end
回调是针对单个 record 对象而言的。当传递给回调的参数是一个实例对象时,把当前 record 对象当做参数,传递并执行实例对象里和回调同名的方法。创建实例对象的时候,你也可以传递参数。
# 2 传递一个可回调对象
class BankAccount < ActiveRecord::Base
before_save EncryptionWrapper.new
after_save EncryptionWrapper.new
after_initialize EncryptionWrapper.new
end
class EncryptionWrapper
def before_save(record)
record.credit_card_number = encrypt(record.credit_card_number)
end
def after_save(record)
record.credit_card_number = decrypt(record.credit_card_number)
end
alias_method :after_initialize, :after_save
private
def encrypt(value)
# Secrecy is committed
end
def decrypt(value)
# Secrecy is unveiled
end
end
# 2 传递一个可回调对象
class BankAccount < ActiveRecord::Base
before_save EncryptionWrapper.new("credit_card_number")
after_save EncryptionWrapper.new("credit_card_number")
after_initialize EncryptionWrapper.new("credit_card_number")
end
class EncryptionWrapper
def initialize(attribute)
@attribute = attribute
end
def before_save(record)
record.send("#{@attribute}=", encrypt(record.send("#{@attribute}")))
end
def after_save(record)
record.send("#{@attribute}=", decrypt(record.send("#{@attribute}")))
end
alias_method :after_initialize, :after_save
private
def encrypt(value)
# Secrecy is committed
end
def decrypt(value)
# Secrecy is unveiled
end
end
# 3 以类方法的形式,传递一个 block
class Napoleon < ActiveRecord::Base
before_destroy { logger.info "Josephine..." }
before_destroy do
# some code
end
# ...
end
# 1
class Topic < ActiveRecord::Base
def before_destroy() destroy_author end
end
class Reply < Topic
def before_destroy() destroy_readers end
end
# 2
class PictureFileCallbacks
def after_destroy(picture_file)
if File.exist?(picture_file.filepath)
File.delete(picture_file.filepath)
end
end
end
class PictureFile < ActiveRecord::Base
after_destroy PictureFileCallbacks.new
end
# 3
class PictureFileCallbacks
def self.after_destroy(picture_file)
if File.exist?(picture_file.filepath)
File.delete(picture_file.filepath)
end
end
end
class PictureFile < ActiveRecord::Base
after_destroy PictureFileCallbacks
end
怎么取消后面的回调?
在方法里返回 false
如何理解 around
用 around_save 举例:
def around_save
# 类似 before save ...
yield # 执行 save
# 类似 after save ...
end