【问题标题】:How can I pass an object from inside run_callbacks to the after_callback scope?如何将对象从 run_callbacks 传递到 after_callback 范围?
【发布时间】:2016-02-29 13:48:06
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails ruby activemodel


    【解决方案1】:

    我花了一点时间思考这个问题,我想出的最佳解决方案是这样的:

    @@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
    

    这很危险吗?有没有更优雅的方式来完成我的任务?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多