这个是 Agile Rails 的一个例子 Code A
class Order < ActiveRecord::Base
before_validation :normalize_credit_card_number
after_create do |order|
logger.info "Order #{order.id} created"
end
protected
def normalize_credit_card_number
self.cc_number.gsub!(/[-\s]/, '')
end
end
Code B
class CreditCardCallbacks
# Normalize the credit card number
def before_validation(model)
model.cc_number.gsub!(/[-\s]/, '') #b1
end
end
class Order < ActiveRecord::Base
before_validation CreditCardCallbacks.new #b2
# ...
end
class Subscription < ActiveRecord::Base
before_validation CreditCardCallbacks.new #b3
# ...
end
Code A 比较简单,但是 Code B 中我不是很能理解,Code B 是将方法抽取到 CreditCardCallbacks 类中,在 b1 处,为什么复写 before_validation, 并且带有一个 model 参数,而在,b2 和 b3 调用方法的时候参数却变成了 CreditCardCallbacks 的 instance ? 不是很明确其中的道理。请指教。提前感谢。