Rails,Devise:覆盖RegistrationsController时current_user为nil

Rails 3.2.5,设计2.1

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

用户属于我在User模型中使用before_savefilter创建的帐户。 这工作正常,并有一段时间。

新代码需要用户的帐户信息作为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在这种情况下是可用的 – 获取我刚刚创建的用户的适当方法是什么?

谢谢

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

我的猜测是还没有创建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。

希望这有帮助!

我可以通过在覆盖时将它们包含在我的控制器中来使用Devise辅助方法。

include Devise::Controllers::Helpers