Использование wisper (библиотеки pubsub) с Devise

Я пытаюсь понять, как использовать Wisper с Devise.

Когда новая учетная запись пользователя зарегистрирована, я хочу создать пример данных для этого пользователя.

Так что в моей пользовательской модели я бы имел:

include Wisper::Publisher
after_create :notify
def notify
  publish(:user_created, self)
end

и мой слушатель будет что-то вроде:

class SampleDataCreator
  def user_created(user)
    user.widgets.create!(name: "Your First Widget")
  end
end

Но я не могу понять, как связать это с разработкой. Как я могу настроить SampleDataCreator слушать события из пользовательской модели Devise?

ОБНОВИТЬ

Я попытался подключить слушателя в контроллере регистрации Devise следующим образом:

class RegistrationsController < Devise::RegistrationsController
  def create
    super do |resource|
      resource.subscribe(SampleDataCreator.new)
    end
  end
end

но кажется, что слушатель никогда не срабатывает.

ОБНОВЛЕНИЕ 2

Я понял, что вышеуказанный подход не работает, потому что запись сохраняется до вызова yield. Кажется, сложно подключиться к Devise до этого момента, поэтому вместо этого я отверг весь метод:

  def create
    build_resource(sign_up_params)

    resource_saved = resource.save
    yield resource if block_given?
    resource.subscribe(SampleDataCreator.new) # <-------------------- my addition
    if resource_saved
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_flashing_format?
        sign_up(resource_name, resource)
        respond_with resource, location: after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format?
        expire_data_after_sign_in!
        respond_with resource, location: after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      respond_with resource
    end
  end

Теперь это работает, хотя и не очень элегантно.

ОБНОВЛЕНИЕ 3

Я нашел гораздо более простой способ, я могу просто подключиться к build_resource:

class RegistrationsController < Devise::RegistrationsController
  def build_resource(sign_up_params)                                                       
    super.subscribe(SampleDataCreator.new)                                                 
  end
end

1 ответ

Я бы подписался на SampleDataCreator глобально.

Я видел сложный проект, где слушатели постоянно отписывались и подписывались. Это было почти хаотично. Я бы рекомендовал избегать динамики подписки / отписки.

Другие вопросы по тегам