未定义的局部变量或方法`current_user' cancancan

时间:2016-02-27 21:09:49

标签: ruby-on-rails

我正在使用登录/注销系统。我没有使用设计,而是创建了一个活动记录用户模型,并使用会话来记住用户是否已登录。一切正常,直到我在application_controller.rb中添加这些行以在登录前进行布局,然后进行一次布局。

layout :set_layout
  def set_layout
    if session[:current_user_id]
      'afterlogin'
    else
      'application'
    end
  end 

现在,在我登录并在html页面的某个地方使用cancancan后,我得到了undefined local variable or method 'current_user'。我认为我必须添加current_user方法,但我不知道在哪里以及如何定义它。

编辑:我已经在登录时使用的另一个类中有类似的东西:

class Admin::ApplicationController < ApplicationController
    before_action :authorize

  def authorize
  begin
    @current_user ||= User.find(session[:current_user_id]) if session[:current_user_id]
  rescue ActiveRecord::RecordNotFound
    session.destroy
    redirect_to '/login',alert: 'Please login'
  end
end

end

添加该方法后,我应该修改它吗?

1 个答案:

答案 0 :(得分:4)

CanCanCan expects a current_user method to exist in the controller. 
First, set up some authentication (such as Authlogic or Devise). 
See Changing Defaults if you need different behavior.

我建议您安装Devise,以便它附带一个免费的current_user方法。

仅供参考:https://github.com/plataformatec/devise

更新

当用户成功登录时,您可以将用户的ID存储在会话中。

session[:current_user_id]=user.id

这样,在你的applicationcontroller中,你可以做到

 def current_user
    @current_user ||= session[:current_user_id] && User.find_by_id(session[:current_user_id]) 
 end
 helper_method :current_user