Привязка наблюдателей к событиям - PullRequest
1 голос
/ 10 февраля 2010

Мы используем AASM во многих наших моделях, но мы немного упрощаем модели. Одна из вещей, которую мы хотели бы сделать, - переместить все элементы уведомлений из моделей в Observers.

Итак, учитывая:

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

Я пробовал это, но безуспешно:

class ClarificationRequestObserver < ActiveRecord::Observer
  observe :clarification_request

  def after_close
    puts '############### message from observer!!!!!'
  end
end

Как я могу переместить: notify_closed для наблюдателя?

Thx!

.Karim

Ответы [ 3 ]

1 голос
/ 13 февраля 2010

Я уже отвечал на ваш комментарий на 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
0 голосов
/ 13 февраля 2010

Я бы сделал что-то вроде этого:

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

Вы также должны включить наблюдателя в список config.active_record.observers в config / environment.rb

Причина в том, что наблюдатель должен наблюдать за объектом. Активно уведомляя (и взаимодействуя) с наблюдателем из модели, вы предполагаете, что есть одна доступная, что я не верю, что вы можете безопасно это сделать (видя, как обычно ведут себя наблюдатели в реальном мире). Это должен решать наблюдатель, заинтересован ли он в событии или нет.

0 голосов
/ 10 февраля 2010

Честно говоря, я думаю, как у вас это хорошо. Имеет смысл использовать хуки AASM для подобных вещей. Таким образом, вы узнаете, что все в порядке, а затем отправляете уведомление.

Вы можете посмотреть на использование грязной активной записи в before_update, чтобы проверить, было ли состояние открыто и закрыто.

...