Cancan在rails 3中的未定义方法角色

时间:2014-06-01 08:50:25

标签: ruby-on-rails ruby ruby-on-rails-3 cancan

目前,我正在为学校管理系统实施一个简单的演示。登录后,我得到以下异常:

undefined method `role' for nil:NilClass
app/models/ability.rb:5:in `initialize'
app/controllers/application_controller.rb:10:in `new'
app/controllers/application_controller.rb:10:in `current_ability'

此处ability.rb

class Ability
  include CanCan::Ability
  def initialize(user)
    if user.role.name=='admin'
      can :manage, :all
    end

    if user.role.name=='teacher'
      can :read, Course
    end
  end
end

此处application_controller.rb

def set_current_user(user)
    @current_user=user
end

def current_ability
  @current_ability||= Ability.new(current_user)
end

def current_user
  @current_user
end

我在users_controller.rb中对用户进行身份验证:

def authenticate
  @user=User.find_by_name_and_password(params[:name],params[:password])

    if @user
      set_current_user(@user)
      respond_to do |format|
       format.html { redirect_to courses_path }
       format.json { head :no_content }
      end
    end
 end

最后在这里你是courses_controllers.rb中的方法索引,它很简单,你可以看到

class CoursesController < ApplicationController
  load_and_authorize_resource
  def index
   @courses = Course.all

   respond_to do |format|
     format.html # index.html.erb
     format.json { render json: @courses }
   end
  end
 end

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

错误告诉你&#34; current_user&#34;是零,情况就是这样。

我假设您对用户进行身份验证,然后将其重定向到courses_path,这一切都很好,因为您实际上已将User的实例分配给current_user。但是,在重定向之后,它并不了解用户,并且似乎没有创建会话。

我建议您在session[:user_id]中分配authenticate,因此您可以在会话期间允许current_user返回用户实例。

此外,您可能只是使用Devise来处理所有这些逻辑。