[英]Rails Undefined Method Error for nil:NilClass
因此,在我的Rails应用程序中,我的用户具有不同的权限。 有人登录后,一切正常。 但是,当没有人登录时,出现以下错误:
Undefined method 'editor?' for nil:NilClass
def require_editor
redirect_to '/error' unless current_user.editor? || current_user.admin?
end
我想我完全理解发生这种情况的原因:因为没有人登录,Rails试图弄清楚他们扮演的角色,并且因为没有人登录而没有角色,所以Rails不知道它是否应该显示页面与否。
我的问题是:如何为未登录的用户设置默认角色,然后将其发送到错误页面,提示他们没有权限?
我通常会这样:
class ApplicationController
def current_user_or_guest
current_user || Guest.new
end
class Guest
def editor?
false
end
def admin?
false
end
end
end
然后简单地
def require_editor
redirect_to '/error' unless current_user_or_guest.editor? || current_user_or_guest.admin?
end
这可以通过使用CanCanCan并从控制器提取授权逻辑来简化。 设置cancan功能后,控制器代码通常如下所示:
def require_editor
redirect_to '/error' unless can?(:edit, MyThing)
end
def require_editor
redirect_to '/error' unless current_user && (current_user.editor? || current_user.admin?)
end
您当前正在呼叫editor?
在nil
对象上,这将引发错误。 通过使用上述技术,您首先要检查以确保current_user
不为nil
,然后对current_user
是否存在进行检查,如果不存在,则仅返回false并重定向到/error
URL。
在ApplicationController
创建一个重定向到错误页面的方法,然后仅在您要确保用户已登录的操作上添加一个before_action
。
def require_editor
unless current_user && (current_user.editor? || current_user.admin?)
redirect_to '/error'
end
end
class Controller < ApplicationController
before_action :require_editor
def new
end
end
如果您使用的是devise
gem,则有一个用于要求身份验证的回调/过滤器
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.