Rails 3 Tutorial 10.4.2: неопределенный метод NoMethodError `admin? 'для ноля: NilClass - PullRequest
2 голосов
/ 07 мая 2011

Я делаю и использую для создания своей собственной системы аутентификации, Учебное пособие Майкла Хартла для 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:
       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)>'

Я думаю, это как-то связано с моим пользовательским контроллером в админке:

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

В чем проблема и как я могу это исправить?

Ответы [ 2 ]

6 голосов
/ 07 мая 2011

кажется, что у вас нет текущего пользователя к тому времени, когда вы вызываете метод 'destroy',

Я думаю, это из-за этой строки

before_filter :admin_user,   :only => :destroy

и, как вы можете видеть, выустанавливают current_user только в: index,: show,: edit,: update

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

Solution

добавление: destroy to: метод authenticate должен решить проблему,и затем к тому времени, когда вы попытаетесь уничтожить current_user там

before_filter :authenticate, :only => [:index,:show,:edit, :update, :destroy]
2 голосов
/ 07 мая 2011

Ваша переменная current_user в методе admin_user в этой ситуации равна нулю, поэтому вам необходимо проверить, что объект не равен нулю в первую очередь:

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     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...