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_user
为nil
,导致代码失败。即使出现故障,我也可以看到用户和帐户记录正在保存在数据库中 - 日志显示commit
,并且记录self.inspect
显示所有我的背景(params,以及更多)都仍然存在。
我原以为current_user
可以在这种情况下使用 - 什么是获得我刚创建的用户的合适方式?
由于
答案 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。
希望这有帮助!