Ril Undefined Method Error for nil:NilClass

时间:2017-09-06 14:24:01

标签: ruby-on-rails ruby

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

Undefined method 'editor?' for nil:NilClass

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

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

我的问题是:如何为未登录的用户设置默认角色,并将其发送到错误页面,表明他们没有获得许可?

3 个答案:

答案 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

的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才能进行身份验证