我试图弄清楚如何将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 用户模型的事件?
更新
我尝试在设计注册控制器中附加监听器,如下所示:
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