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

#ruby-on-rails #ruby #devise #publish-subscribe #wisper

#ruby-on-rails #ruby #разработка #опубликовать-подписаться #wisper

Вопрос:

Я пытаюсь понять, как использовать 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
 

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

Обновить

Я попытался подключить прослушиватель в контроллере регистрации 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. отличное решение (обновление 3), другим менее привлекательным вариантом была бы глобальная подписка SampleDataCreator.new : github.com/krisleech/wisper#global-listeners

Ответ №1:

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

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