Ril未定义的方法错误为nil:NilClass

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不知道它是否应该显示页面与否.

我的问题是:如何为未登录的人创建默认角色,并将其发送到错误页面,表明他们没有权限?

Ser*_*sev 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
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)