Rails设计 - current_user是零

时间:2013-08-24 22:20:35

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

出于某种原因,current_user在我的无模型控制器(nil)中返回Subscriptions。我没有在互联网上找到任何证明这种行为的理由......

class SubscriptionsController < ApplicationController  
  def new
    ...
  end

  def create
    current_user    # returns nil
  end
end

我有一个csrf元标记:

<meta content="xxx" name="csrf-token">

我可以提供更多代码,但我不确定什么是有用的。

更新

因此,感谢评论/答案,我已将问题确定为一个特定的行动:create

如果我将@user = current_user添加到new,我可以在new视图中显示当前用户的电子邮件。但是,在我的create控制器中,current_user会返回nil

我通过表单(提交)访问了create操作。

在提交表单之前,我验证输入,然后向Stripe发送请求以从表单中获取令牌。如果没有错误(验证和条带),我然后发送表单。

这可能是原因吗?

更新2

在我的错误消息中,我的会话转储是为空,而它应该包含current_user信息......

4 个答案:

答案 0 :(得分:11)

事实证明我正在制作的AJAX请求没有携带CSRF令牌。出于这个原因,Rails正在杀死我的会议。

我在skip_before_filter :verify_authenticity_token中添加了SubscriptionsController,现在正在使用。它可能不是最安全的解决方案,但它现在有效,所以我会继续开发并稍后回到这个问题。

答案 1 :(得分:4)

请注意,使用form_tag帮助程序创建表单时,它们不会自动生成包含CSRF身份验证令牌的隐藏字段。我使用我有时喜欢使用的form_tag构建的表单遇到了同样的问题。

我通过在表单中​​包含以下帮助程序来修复此问题:

<%= hidden_field_tag 'authenticity_token', form_authenticity_token %>

它基本上是一种生成CSRF所需的隐藏字段的手动方式。

答案 2 :(得分:3)

current_user工作,您需要在课程中添加before_filter :authenticate_user!,例如:

class SubscriptionsController < ApplicationController  
  before_filter :authenticate_user!

  def new
    ...
  end

  def create
    curent_user    # returns nil
  end
end

并且authenticate_user!方法将为您设置当前用户:)

答案 3 :(得分:0)

我有一个类似的问题,但是我正在编辑模型。因此,每次我突然更新模型时,都会发生这种情况:

current_model to nil

经过分析,结果发现,如果您将密码保留在表单中,则当用户尝试编辑某些属性时,该人将被迫编写密码。
交付并更新表单后,当有人更新密码时,Devise会进行合理的操作,这将破坏会话并要求用户再次登录。

这就是current_model突然变为零的原因。希望对您有帮助,祝您有美好的一天!