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