首页 文章

Ril Undefined Method Error for nil:NilClass

提问于
浏览
1

所以在我的rails应用程序中,我有不同权限的用户 . 当有人登录时,一切都很完美 . 但是,当没有人登录时,我收到以下错误:

Undefined method 'editor?' for nil:NilClass

def require_editor
    redirect_to '/error' unless current_user.editor? || current_user.admin?
end

我想我明白为什么会发生这种情况:因为没有人登录,Rails正试图弄清楚他们有什么角色,并且因为没有人没有登录它的角色,Rails不知道它是否应该显示页面与否 .

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

3 回答

  • 5
    def require_editor
        redirect_to '/error' unless current_user && (current_user.editor? || current_user.admin?)
    end
    

    您当前正在 nil 对象上调用 editor? ,这会引发错误 . 通过使用上述技术,您首先检查以确保 current_user 不是 nil ,然后对 current_user 执行检查(如果存在),如果不存在则返回false并重定向到 /error URL .

  • 2

    我通常做这样的事情:

    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
    
  • 0

    ApplicationController 内部创建一个重定向到错误页面的方法,然后仅在您要确保用户已登录的操作上添加 before_action

    ApplicationController

    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来进行身份验证

相关问题