Rails,Devise:覆盖RegistrationsController时current_user为nil

时间:2012-07-06 21:34:41

标签: ruby-on-rails ruby-on-rails-3 devise

Rails 3.2.5,Devise 2.1

使用Devise对用户进行身份验证,并在创建新用户时遇到问题。

用户属于我在用户模型中使用before_save过滤器创建的帐户。这很好,有一段时间了。

新代码要求用户的帐户信息作为create方法的一部分。我依赖于请求中传递的参数,因此这不适合模型逻辑。我已经覆盖了Devise :: RegistrationsController #create方法:

class DeviseCustom::RegistrationsController < Devise::RegistrationsController
  def create
    super                                  # Call Devise's create
    account = current_user.account         # FAIL! (current_user is nil)
    account.partner_id = current_partner
    account.save!
  end
end

current_usernil,导致代码失败。即使出现故障,我也可以看到用户和帐户记录正在保存在数据库中 - 日志显示commit,并且记录self.inspect显示所有我的背景(params,以及更多)都仍然存在。

我原以为current_user可以在这种情况下使用 - 什么是获得我刚创建的用户的合适方式?

由于

2 个答案:

答案 0 :(得分:3)

我能够通过将它们包含在我的控制器中来使用Devise帮助器方法 什么时候覆盖。

include Devise::Controllers::Helpers

答案 1 :(得分:1)

前言:我从未使用过设计。

我的猜测是还没有创建current_user对象,因为在调用链中没有理由(没有用户凭据),或者因为它还没有在#after_save中发生(如果存在吗?)。

Devise使用#resource方法来获取您尝试保存的当前实例变量(或者看起来如此):

https://github.com/plataformatec/devise/blob/master/app/controllers/devise_controller.rb#L16

我要做的是将其改为:

class DeviseCustom::RegistrationsController < Devise::RegistrationsController
    def create
      super                                  # Call Devise's create
      account = resource.account         # FAIL! (current_user is nil)
      account.partner_id = resource.current_partner
      account.save!
    end
end

您可能希望将此添加到您的模型中:

attr_accessor :current_partner

允许您从资源(模型)访问current_partner。

希望这有帮助!