出于某种原因,current_user
在我的模型少控制器(nil
)返回Subscriptions
。我发现在互联网上没有证明这种行为...
class SubscriptionsController < ApplicationController
def new
...
end
def create
current_user # returns nil
end
end
我有一个CSRF meta标签:
<meta content="xxx" name="csrf-token">
我可以提供更多的代码,但我不知道什么是有用的。
UPDATE
所以,感谢的意见/答案,我已经查明的问题,以一个特定的动作:create
。
如果我添加@user = current_user
到new
,我可以告诉我的new
针对当前用户的电子邮件。然而,在我create
控制器,current_user
返回nil
。
我通过表单(提交)访问create
行动。
提交表单之前,我验证输入,然后发送到条纹得到令牌的表格的请求。如果没有错误(验证和条纹),我再发的形式。
莫非是原因?
更新2
在我的错误信息,我会转储是空的,而它应该包含CURRENT_USER信息...
原来,AJAX请求我做不携带CSRF令牌。出于这个原因,滑道被杀死了我的会话。
我在skip_before_filter :verify_authenticity_token
添加SubscriptionsController
和它现在的工作。它可能不是最安全的解决方案,但它的工作原理现在,所以我继续发展,然后回来这个问题以后。
请注意,当您创建使用form_tag
辅助形式,它们不会自动生成后者持有CSRF认证令牌的隐藏字段。我跑进了一个我用,我有时喜欢使用form_tag
构造形式同样的问题。
我通过包括表单中的以下助手解决了该问题:
<%= hidden_field_tag 'authenticity_token', form_authenticity_token %>
它基本上生成你需要的东西CSRF的隐藏字段的手动方式。
对于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!
方法设置当前用户为你:)
我有一个类似的问题,但我在编辑模式。所以每次我更新了模型突然会发生:
current_model to nil
分析事以后,事实证明,如果你在表单中,当用户试图编辑一些属性保留密码,此人随后被迫写密码。 一旦形式发布和更新,设计是否合理的事情时,有人更新了密码,这是摧毁了会议,并要求用户重新登录。
所以这就是为什么current_model
突然转向为零。希望这有助于,有一个伟大的日子!