6

我有 Rails (4.0) 使用 model 运行 Devise gem (3.1.0) User。我有控制器命名CollectionsController,我想current_user在这个控制器中使用 Devise 的访问器方法获取当前登录的用户对象。

之后它返回undefined local variable or method 'current_user' for CollectionsController:Class。最有趣的是,例如,当我尝试在另一个控制器中做同样的事情时PagesController——一切都完美无缺!
UPD:共享我的控制器的“代码”:)

class CollectionsController < ActionController::Base
    def index
         @user = current_user
    end
end

方法的来源current_user是由设计而不是我定义的。所以我不认为这是问题所在。

4

5 回答 5

18

current_user是 Devise 提供的一种便捷方法ApplicationController。您的控制器应该从它继承:

class CollectionsController < ApplicationController

看来您可能将ActiveRecord::Base(由模型子类化)与ActionController(由控制器子类化)混为一谈。根据Rails 文档

默认情况下,只有 Rails 应用程序中的 ApplicationController 继承自 ActionController::Base。所有其他控制器依次继承自 ApplicationController。

于 2013-10-02T22:32:54.953 回答
4

添加before_action :authenticate_user! 到您的控制器。

见: https ://github.com/plataformatec/devise#controller-filters-and-helpers

于 2015-01-12T06:17:24.033 回答
1

我遇到了同样的问题。有些控制器可以访问current_user,有些则不能。在一种情况下,它是一个erb正在访问的文件,current_user但只有在询问user_signed_in?我添加了检查我的控制器代码和瞧! current_user可用。

于 2014-06-12T19:47:45.403 回答
0

current_user实例方法,而不是方法。

注意CollectionsController:Class提及Class这意味着您 current_user在类内部而不是实例内部调用。


class CollectionsController < ApplicationController

  current_user # wrong place. Here, current_user is on the Class.

  def index
    current_user # right place. Here, current_user is on the instance.
  end
end
于 2022-01-11T14:55:45.153 回答
-2
class CollectionsController < ApplicationController
    include Devise::Controllers::Helpers 
    def index
         @user = current_user
    end
end

如上所示,在您的控制器中添加(包括 Devise::Controllers::Helpers)。

于 2019-03-17T19:26:47.253 回答