Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails nil:NilClass的Rails未定义方法错误_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails nil:NilClass的Rails未定义方法错误

Ruby on rails nil:NilClass的Rails未定义方法错误,ruby-on-rails,ruby,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应用程序中,我有不同权限的用户。当有人登录时,一切正常。但是,当没有人登录时,我会出现以下错误:

Undefined method 'editor?' for nil:NilClass

def require_editor
    redirect_to '/error' unless current_user.editor? || current_user.admin?
end
我想我完全理解为什么会发生这种情况:因为没有人登录,Rails试图找出他们的角色,因为没有人登录,Rails不知道是否应该显示页面

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

def require_editor
    redirect_to '/error' unless current_user && (current_user.editor? || current_user.admin?)
end
你现在打电话给编辑?在nil对象上,该对象正在抛出错误。通过使用上述技术,您首先检查以确保当前_用户不是nil,然后对当前_用户(如果存在)执行检查,如果不存在,则返回false并重定向到/error URL


你现在打电话给编辑?在nil对象上,该对象正在抛出错误。通过使用上述技术,您首先要检查以确保当前\u用户不是零,然后对当前\u用户执行检查(如果它存在),如果不存在,它只会返回false并重定向到/error URL。

我通常会这样做:

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 can?(:edit, MyThing)
end
然后简单地

def require_editor
  redirect_to '/error' unless current_user_or_guest.editor? || current_user_or_guest.admin?
end
这可以通过使用和从控制器中提取授权逻辑来简化。设置cancan能力后,控制器代码通常如下所示:

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 can?(:edit, MyThing)
end

我通常会这样做:

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 can?(:edit, MyThing)
end
然后简单地

def require_editor
  redirect_to '/error' unless current_user_or_guest.editor? || current_user_or_guest.admin?
end
这可以通过使用和从控制器中提取授权逻辑来简化。设置cancan能力后,控制器代码通常如下所示:

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 can?(:edit, MyThing)
end
在ApplicationController内部,创建一个重定向到错误页面的方法,然后仅在要确保用户已登录的操作上添加before_操作

应用控制器 控制器:您想引发此错误吗 如果您使用的是Desive gem,则在应用程序控制器中有一个要求身份验证的方法。请创建一个重定向到错误页面的方法,然后仅在要确保用户已登录的操作上添加before_操作

应用控制器 控制器:您想引发此错误吗
如果您使用的是Desive gem,则需要进行身份验证,实际上,当前用户是nil,nil不响应编辑器?还是管理员?。nil是Ruby用来描述“无”的方式。但有人没有记录这不是什么。顺便说一句,使用一个对象来代替缺少的对象被称为,这是解决这个问题的一种优雅方式。当前用户来自哪里?你在用Desive吗?@Stefan:哈,我知道Sandi Metz会说什么都不是。当然,是她:实际上,当前用户是nil,nil不响应编辑器?还是管理员?。nil是Ruby用来描述“无”的方式。但有人没有记录这不是什么。顺便说一句,使用一个对象来代替缺少的对象被称为,这是解决这个问题的一种优雅方式。当前用户来自哪里?你在用Desive吗?@Stefan:哈,我知道Sandi Metz会说什么都不是。当然,是她:这个!提取授权逻辑是最佳途径。一开始就用一些条件句很容易,后来却变成了一团乱麻!提取授权逻辑是最佳途径。很容易从一些条件开始,后来却变得更糟。这叫做短路,这是一个重要的编程概念:在计算and时:它在第一个false时停止。示例:false&&raise Error不会引发错误。当计算and时,它在第一个true后停止。这叫做短路,这是一个重要的编程概念:当计算and时:它在第一个false时停止。示例:false&&raise Error不会引发错误。计算or时,它在第一个true之后停止。