所以在我的rails应用程序中,我有不同权限的用户。当有人登录时,一切都很完美。但是,当没有人登录时,我收到以下错误:
Undefined method 'editor?' for nil:NilClass
def require_editor
redirect_to '/error' unless current_user.editor? || current_user.admin?
end
我想我明白为什么会发生这种情况:因为没有人登录,Rails正在试图弄清楚他们有什么角色,而且因为没有人没有登录它的角色,Rails不知道如果它应该显示页面。
我的问题是:如何为未登录的用户设置默认角色,并将其发送到错误页面,表明他们没有获得许可?
答案 0 :(得分:5)
我通常做这样的事情:
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
答案 1 :(得分:2)
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
网址。
答案 2 :(得分:0)
在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,则需要callback/filter才能进行身份验证