我们的对象有几个定义的生命周期回调方法。在触发回调的每个方法中,都会创建一个Event对象以用于跟踪目的。生命周期事件定义如下:
@@LIFECYCLE_CALLBACKS = [
:send_email,
:start_time,
:end_time,
:review
].each do |callback|
define_model_callbacks callback
define_method callback do
run_callbacks callback do
#The Event object is created here
track_lifecycle_action callback
end
end
end
在某些生命周期方法中,我需要向Event对象添加其他信息。我想将块附加到生成的回调中,如下所示:
after_send_email :add_additional_details_to_event
如何修改代码以始终将run_callbacks块内创建的Event对象传递给after_callback回调运行的块的上下文?我不认为我可以假设self.events.last
将始终返回正确的Event对象。
答案 0 :(得分:0)
我花了一点时间思考这个问题,我提出的最佳解决方案看起来像这样:
@@LIFECYCLE_CALLBACKS = [
:send_email,
:start_time,
:end_time,
:review
].each do |callback|
define_model_callbacks callback
define_method callback do
@event = track_lifecycle_action callback
run_callbacks callback do
end
end
end
现在,当我使用像评论
这样的回调注册方法时after_review :print_event
我已经意识到传递给回调宏的所有块共享相同的实例范围,所以我可以做这样的事情
def print_event
puts @event
end
这是危险的吗?是否有更优雅的方式来完成我的任务?