Ruby on rails Rails 3教程10.4.2:NoMethodError未定义的方法“admin”和#x27;零级:零级

Ruby on rails Rails 3教程10.4.2:NoMethodError未定义的方法“admin”和#x27;零级:零级,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我正在做和使用它来构建自己的身份验证系统,在做的时候遇到了一个问题。我完成了10.4.2的整个部分,但是当我结束并运行测试时,我总是得到这个错误 1) UsersController GET 'index' DELETE 'destroy' as a non-signed-in user should deny access Failure/Error: delete :destroy, :id => @user NoMethodError: undef

我正在做和使用它来构建自己的身份验证系统,在做的时候遇到了一个问题。我完成了10.4.2的整个部分,但是当我结束并运行测试时,我总是得到这个错误

 1) UsersController GET 'index' DELETE 'destroy' as a non-signed-in user should deny access
     Failure/Error: delete :destroy, :id => @user
     NoMethodError:
       undefined method `admin?' for nil:NilClass
     # ./app/controllers/users_controller.rb:68:in `admin_user'
     # ./spec/controllers/users_controller_spec.rb:245:in `block (5 levels) in <top (required)>'
1)UsersController获取“索引”删除“销毁”,因为未登录用户应拒绝访问
失败/错误:delete:destroy,:id=>@user
命名错误:
nil:NilClass的未定义方法“admin”
#/app/controllers/users\u controller.rb:68:in'admin\u user'
#./spec/controllers/users\u controllers\u spec.rb:245:in'block(5级)in'
我认为这与我在管理区域的用户控制器有关:

class UsersController < ApplicationController
    before_filter :authenticate, :only => [:index,:show,:edit, :update]
    before_filter :correct_user, :only => [:edit, :update]
    before_filter :admin_user,   :only => :destroy
        .
        .
        .
        .
        .
    def destroy
        User.find(params[:id]).destroy
        flash[:success] = "USER DELETED."
        redirect_to users_path
    end


    private

        def authenticate
            deny_access unless signed_in?
        end

        def correct_user
            @user = User.find(params[:id])
            redirect_to(root_path) unless current_user?(@user)
        end

        def admin_user
            redirect_to(root_path) unless current_user.admin?
        end                
end
class UsersController[:index,:show,:edit,:update]
在\u筛选器之前:更正\u用户,:only=>[:编辑,:更新]
在\u filter:admin\u user之前,:only=>:destroy
.
.
.
.
.
def销毁
User.find(params[:id]).destroy
flash[:success]=“用户已删除。”
将\u重定向到用户\u路径
结束
私有的
def身份验证
除非已登录,否则拒绝访问?
结束
def正确的用户
@user=user.find(参数[:id])
重定向到(根路径),除非当前用户(@user)
结束
def管理员用户
将_重定向到(根路径),除非当前_user.admin?
结束
结束

问题是什么?我如何解决这个问题?

在这种情况下,
管理用户
方法中的
当前用户
变量为nil,因此需要首先检查对象是否为nil:

def admin_user
  authenticate # if this method doesn't terminate the processing, you'll have to alter the line below too
  redirect_to(root_path) unless current_user.admin?
  # or: redirect_to(root_path) unless current_user && current_user.admin?
end     

在调用“destroy”方法时,您似乎没有当前用户

我想是因为这条线

before_filter :admin_user,   :only => :destroy
如您所见,您仅在:index、:show、:edit、:update中设置当前用户

before_filter :authenticate, :only => [:index,:show,:edit, :update]
解决方案

添加:destroy to:authenticate方法应该可以解决这个问题,然后在您尝试销毁当前用户时,该用户已经存在

before_filter :authenticate, :only => [:index,:show,:edit, :update, :destroy]

好的,这个代码正在检查那个对象吗?如果是这样,还是没有运气。