我已经使用模型User
运行Devise gem(3.1.0)的Rails(4.0)。我有一个名为CollectionsController
的控制器,我想在此控制器中使用Devise的访问器方法current_user
获取当前登录的用户对象。
然后返回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
方法的来源由Devise定义,而不是我。所以我认为这不是问题所在。
答案 0 :(得分:12)
current_user
是Devise提供给ApplicationController
的便捷方法。你的控制器应该继承它:
class CollectionsController < ApplicationController
看起来你可能会将ActiveRecord::Base
(由模型子类化)与ActionController
(由控制器子类化)混为一谈。根据{{3}}:
默认情况下,只有Rails应用程序中的ApplicationController继承自ActionController :: Base。所有其他控制器依次从ApplicationController继承。
答案 1 :(得分:3)
将before_action :authenticate_user!
添加到您的控制器。
请参阅: https://github.com/plataformatec/devise#controller-filters-and-helpers
答案 2 :(得分:1)
我遇到了同样的问题。有些控制器可以访问current_user
而其他控制器则无法访问。在一个案例中,它是一个访问erb
的{{1}}文件,但只有在询问current_user
之后我才在我的控制器代码中添加了该检查并瞧! user_signed_in?
可用。
答案 3 :(得分:0)
class CollectionsController < ApplicationController
include Devise::Controllers::Helpers
def index
@user = current_user
end
end
在控制器中添加(包括Devise :: Controllers :: Helpers),如上所示。