Mar*_*tin 1 ruby ruby-on-rails
所以在我的rails应用程序中,我有不同权限的用户.当有人登录时,一切都很完美.但是,当没有人登录时,我收到以下错误:
Undefined method 'editor?' for nil:NilClass
def require_editor
redirect_to '/error' unless current_user.editor? || current_user.admin?
end
Run Code Online (Sandbox Code Playgroud)
我想我明白为什么会发生这种情况:因为没有人登录,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
Run Code Online (Sandbox Code Playgroud)
然后简单
def require_editor
redirect_to '/error' unless current_user_or_guest.editor? || current_user_or_guest.admin?
end
Run Code Online (Sandbox Code Playgroud)
这可以通过使用CanCanCan并从控制器中提取授权逻辑来简化.通过设置cancan功能,控制器代码通常如下所示:
def require_editor
redirect_to '/error' unless can?(:edit, MyThing)
end
Run Code Online (Sandbox Code Playgroud)