目前,我正在为学校管理系统实施一个简单的演示。登录后,我得到以下异常:
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
非常感谢任何帮助!
答案 0 :(得分:2)
错误告诉你&#34; current_user&#34;是零,情况就是这样。
我假设您对用户进行身份验证,然后将其重定向到courses_path
,这一切都很好,因为您实际上已将User
的实例分配给current_user
。但是,在重定向之后,它并不了解用户,并且似乎没有创建会话。
我建议您在session[:user_id]
中分配authenticate
,因此您可以在会话期间允许current_user
返回用户实例。
此外,您可能只是使用Devise来处理所有这些逻辑。