未定义的方法`is_admin?'为零:NilClass :(

时间:2014-06-02 13:10:05

标签: ruby-on-rails ruby-on-rails-4 admin activeadmin

我想限制仅限管理员访问我的pannel admin(gem active_admin)。

这是我的代码

class ApplicationController < ActionController::Base
    def authenticate_admin!
        unless current_user.is_admin?
            flash[:error] = "Access denied"
            redirect_to root_path
        end
    end

问题是:未定义的方法`is_admin?'为零:NilClass

我的数据库中有一个布尔管理员(0假,真1)

我要定义我的is_admin ?,但是我试着找不到他。那我该怎么做呢?

感谢您的帮助

4 个答案:

答案 0 :(得分:0)

问题在于您的错误消息。 nil没有方法'is_admin?'。这意味着您的当前用户变量未设置。您需要将未登录的用户重定向到可以执行此操作的屏幕。然后通过此authenticate_admin!函数指示他们,或者首先将所有管理员用户重定向到/admin路径,或者只是将所有用户推送到您的主页,以便他们点击管理员链接。

答案 1 :(得分:0)

可能是current_user设置正确,但是当没有登录用户时会调用此方法。

您应该将此方法与另一个需要用户登录的过滤器结合使用,即需要定义current_user。这通常称为require_user

例如,在您的应用程序控制器中(因此它将被所有控制器继承)

before_filter :require_user

protected
def require_user
  unless current_user
    redirect_to "/" and return
  end
end

然后使用skip_before_filter为未登录的操作设置例外。

现在,您可以添加authenticate_admin!作为管理控制器中的前置过滤器:只有在传递了require_user时才会调用它,因此它应该是安全的。

答案 2 :(得分:0)

添加try:<% if current_user.try(:is_admin?) %>

答案 3 :(得分:-1)

尝试在before_action :authenticate_user!方法之前添加:authentificate_admin!(如果您的用户名为&#39; user&#39;)。在此更改之后,您的应用会首先将未登录的用户重定向到登录表单,然后才会询问您的用户是否是管理员?&#39;。