Использование 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 глобально.
Я видел сложный проект, где слушатели постоянно отписывались и подписывались. Это было почти хаотично. Я бы рекомендовал избегать динамики подписки / отписки.