1

我试图弄清楚如何将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
4

1 回答 1

0

我会在全球范围内订阅 SampleDataCreator。

我看到一个复杂的项目,听众一直在退订和订阅。几乎是一片混乱。我建议避免订阅/取消订阅动态。

于 2015-02-05T14:48:37.153 回答