出于某种原因,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信息......
答案 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
突然变为零的原因。希望对您有帮助,祝您有美好的一天!