Ruby on rails 将观察员与事件挂钩

Ruby on rails 将观察员与事件挂钩,ruby-on-rails,aasm,Ruby On Rails,Aasm,我们在相当多的模型中使用AASM,但我们希望简化一些模型。我们想做的一件事是将所有的通知内容从模型中移出,放到观察者中 因此,考虑到: class ClarificationRequest < ActiveRecord::Base include AASM aasm_initial_state :open # States aasm_state :open aasm_state :closed # Events aasm_event :close, :af

我们在相当多的模型中使用AASM,但我们希望简化一些模型。我们想做的一件事是将所有的通知内容从模型中移出,放到观察者中

因此,考虑到:

class ClarificationRequest < ActiveRecord::Base
  include AASM

  aasm_initial_state :open

  # States
  aasm_state :open
  aasm_state :closed

  # Events
  aasm_event :close, :after => :notify_closed do transitions :to => :closed, :from => [:open,:replied], :guard => :can_close? end
end
类澄清请求:notify_closed do转换:to=>:closed,:from=>[:open,:reply],:guard=>:可以关闭吗?结束
结束
我试过这个,但运气不好:

class ClarificationRequestObserver < ActiveRecord::Observer
  observe :clarification_request

  def after_close
    puts '############### message from observer!!!!!'
  end
end
类澄清请求观察者
如何将:notify_移动到靠近观察者的位置

谢谢


.卡里姆

老实说,我认为你是如何得到它的。使用AASM钩子来处理这样的东西是有意义的。通过这种方式,您知道它已转换为OK,然后发送通知


您可以在“更新前”中使用active record dirty来检查状态是否已打开,现在是否已关闭。

老实说,我认为您的状态很好。使用AASM钩子来处理这样的东西是有意义的。通过这种方式,您知道它已转换为OK,然后发送通知


您可以在before\u更新中使用active record dirty来检查状态是否已打开,现在是否已关闭。

我之前已经回复了您对github的评论,我将在这里重复,以防万一

class ClarificationRequest < ActiveRecord::Base
    include AASM

    aasm_initial_state :open

    # States
    aasm_state :open
    aasm_state :closed

    # Events
    aasm_event :close, :after => :notify_closed do transitions :to => :closed, :from => [:open,:replied], :guard => :can_close? end

    # Notify Observer
    def notify_closed
     notify :close # this will trigger after_close method call in ClarificationRequestObserver
     # notify :closed # this will trigger after_closed method call in ClarificationRequestObserver
     # notify :whatever # this will trigger after_whatever method call in ClarificationRequestObserver
    end
end
类澄清请求:notify_closed do转换:to=>:closed,:from=>[:open,:reply],:guard=>:可以关闭吗?结束
#通知观察员
def通知单元已关闭
notify:close#这将在CleartificationRequestObserver中的_close方法调用后触发
#notify:closed#这将在CleartificationRequestObserver中的_closed方法调用后触发
#notify:whatever#这将在澄清请求观察者中的_whater方法调用后触发
结束
结束

我之前已经回复了您对github的评论,我将在这里重复,以防万一

class ClarificationRequest < ActiveRecord::Base
    include AASM

    aasm_initial_state :open

    # States
    aasm_state :open
    aasm_state :closed

    # Events
    aasm_event :close, :after => :notify_closed do transitions :to => :closed, :from => [:open,:replied], :guard => :can_close? end

    # Notify Observer
    def notify_closed
     notify :close # this will trigger after_close method call in ClarificationRequestObserver
     # notify :closed # this will trigger after_closed method call in ClarificationRequestObserver
     # notify :whatever # this will trigger after_whatever method call in ClarificationRequestObserver
    end
end
类澄清请求:notify_closed do转换:to=>:closed,:from=>[:open,:reply],:guard=>:可以关闭吗?结束
#通知观察员
def通知单元已关闭
notify:close#这将在CleartificationRequestObserver中的_close方法调用后触发
#notify:closed#这将在CleartificationRequestObserver中的_closed方法调用后触发
#notify:whatever#这将在澄清请求观察者中的_whater方法调用后触发
结束
结束

我会这样做:

class ClarificationRequest < ActiveRecord::Base
  include AASM

  aasm_initial_state :open

  # States
  aasm_state :open
  aasm_state :closed, :enter => :do_close

  # Events
  aasm_event :close do transitions :to => :closed, :from => [:open,:replied], :guard => :can_close? end

  def recently_closed?
    @recently_closed
  end 
protected
  def do_close
    @recently_closed = true
  end

end


class ClarificationRequestObserver < ActiveRecord::Observer
  observe :clarification_request

  def after_save(clarification_request)
    puts '############### message from observer!!!!!' if clarification_request.recently_closed?
  end
end
类澄清请求:执行_关闭
#事件
aasm_事件:关闭do转换:到=>:closed,:from=>[:打开,:回复],:guard=>:can_关闭?结束
def最近关闭了吗?
@最近关闭了
结束
受保护的
def do_关闭
@最近关闭=真
结束
结束
类澄清请求观察者
您还应该在config/environment.rb的
config.active\u record.observators
列表中包含观察者


原因是观察者应该观察一个物体。通过主动通知模型中的观察者(并与之交互),您可以假设存在一个可用的观察者,但我认为您不能安全地做到这一点(查看观察者在现实世界中的行为)。观察者是否对事件感兴趣应该由观察者决定。

我会这样做:

class ClarificationRequest < ActiveRecord::Base
  include AASM

  aasm_initial_state :open

  # States
  aasm_state :open
  aasm_state :closed, :enter => :do_close

  # Events
  aasm_event :close do transitions :to => :closed, :from => [:open,:replied], :guard => :can_close? end

  def recently_closed?
    @recently_closed
  end 
protected
  def do_close
    @recently_closed = true
  end

end


class ClarificationRequestObserver < ActiveRecord::Observer
  observe :clarification_request

  def after_save(clarification_request)
    puts '############### message from observer!!!!!' if clarification_request.recently_closed?
  end
end
类澄清请求:执行_关闭
#事件
aasm_事件:关闭do转换:到=>:closed,:from=>[:打开,:回复],:guard=>:can_关闭?结束
def最近关闭了吗?
@最近关闭了
结束
受保护的
def do_关闭
@最近关闭=真
结束
结束
类澄清请求观察者
您还应该在config/environment.rb的
config.active\u record.observators
列表中包含观察者


原因是观察者应该观察一个物体。通过主动通知模型中的观察者(并与之交互),您可以假设存在一个可用的观察者,但我认为您不能安全地做到这一点(查看观察者在现实世界中的行为)。观察者是否对事件感兴趣应该取决于观察者。

这种方法的一个主要问题是,我们实际上想要创建事件(一种审计模型),同时也需要有当前的用户id,而据我所知,没有简单或适当的方法将其包含在模型中。。。因此观察员?虽然这可能不理想,但您可以获得如下用户id:在用户模型中添加cattr_访问器:current_user。在应用程序控制器中添加一个before_过滤器,该过滤器调用def set_current_user.current_user=self.current_user这种方法的一个主要问题是,我们实际上想要创建同样需要当前_user_id的事件(一种审计模型)