12

出于某种原因,在我的无模型控制器 ( )中current_user返回。我在互联网上找不到任何证据来证明这种行为是正当的......nilSubscriptions

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

4 回答 4

12

原来我发出的 AJAX 请求没有携带 CSRF 令牌。出于这个原因,Rails 正在扼杀我的会话。

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

于 2013-08-25T19:45:25.267 回答
5

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

我通过在表单中​​包含以下助手解决了这个问题:

<%= hidden_field_tag 'authenticity_token', form_authenticity_token %>

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

于 2014-01-29T16:53:15.383 回答
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!方法将为您设置当前用户:)

于 2013-08-24T22:31:19.240 回答
1

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

current_model to nil

经过分析,事实证明,如果您将密码留在表单中,当用户尝试编辑某些属性时,该人就会被迫输入密码。
一旦表单交付并更新,当有人更新密码时,Devise 会做理性的事情,即销毁会话并要求用户再次登录。

所以这就是为什么current_model突然变成零的原因。希望这会有所帮助,祝您有美好的一天!

于 2019-02-05T22:29:21.433 回答