如何将对象从run_callbacks内部传递到after_callback范围?

时间:2016-02-29 13:48:07

标签: ruby-on-rails ruby activemodel

我们的对象有几个定义的生命周期回调方法。在触发回调的每个方法中,都会创建一个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对象。

1 个答案:

答案 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
这是危险的吗?是否有更优雅的方式来完成我的任务?