2

Rails 3.2.5,设计 2.1

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

用户属于我使用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显示我的所有上下文(参数等)都仍然存在。

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

谢谢

4

2 回答 2

4

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

include Devise::Controllers::Helpers

于 2013-06-16T06:28:06.293 回答
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。

希望这会有所帮助!

于 2012-07-07T00:07:10.560 回答