Rails的设计 - CURRENT_USER为零

问题描述 投票:11回答:4

出于某种原因,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_usernew,我可以告诉我的new针对当前用户的电子邮件。然而,在我create控制器,current_user返回nil

我通过表单(提交)访问create行动。

提交表单之前,我验证输入,然后发送到条纹得到令牌的表格的请求。如果没有错误(验证和条纹),我再发的形式。

莫非是原因?

更新2

在我的错误信息,我会转储是空的,而它应该包含CURRENT_USER信息...

ruby-on-rails ruby ruby-on-rails-3 devise
4个回答
11
投票

原来,AJAX请求我做不携带CSRF令牌。出于这个原因,滑道被杀死了我的会话。

我在skip_before_filter :verify_authenticity_token添加SubscriptionsController和它现在的工作。它可能不是最安全的解决方案,但它的工作原理现在,所以我继续发展,然后回来这个问题以后。


4
投票

请注意,当您创建使用form_tag辅助形式,它们不会自动生成后者持有CSRF认证令牌的隐藏字段。我跑进了一个我用,我有时喜欢使用form_tag构造形式同样的问题。

我通过包括表单中的以下助手解决了该问题:

<%= hidden_field_tag 'authenticity_token', form_authenticity_token %>

它基本上生成你需要的东西CSRF的隐藏字段的手动方式。


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!方法设置当前用户为你:)


0
投票

我有一个类似的问题,但我在编辑模式。所以每次我更新了模型突然会发生:

current_model to nil

分析事以后,事实证明,如果你在表单中,当用户试图编辑一些属性保留密码,此人随后被迫写密码。 一旦形式发布和更新,设计是否合理的事情时,有人更新了密码,这是摧毁了会议,并要求用户重新登录。

所以这就是为什么current_model突然转向为零。希望这有助于,有一个伟大的日子!

© www.soinside.com 2019 - 2024. All rights reserved.