Атрибуты булевой модели как автоматические методы - PullRequest
1 голос
/ 13 июля 2010

Я работаю через http://railstutorial.org (в настоящее время работаю над разделом 10.4.2 - уничтожение пользователей).

Моя модель User имеет логический атрибут admin, и в контроллере Users естьнекоторый простой код, использующий этот атрибут:

def admin_user
  redirect_to(root_path) unless current_user.admin?
end

Тест RSpec:

describe "as a non-signed-in user" do
  it "should deny access" do
    delete :destroy, :id => @user
    response.should redirect_to(signin_path)
  end
end

И ошибка, которую этот тест выдает:

NoMethodError in'UsersController DELETE' destroy 'как не авторизованный пользователь должен запретить доступ' undefined метод `admin? 'для nil: NilClass

Что такое nil: NilClass?Почему я получаю это?

edit : j., Это может помочь:

  def sign_in(user)
    user.remember_me!
    cookies[:remember_token] = { :value => user.remember_token,
                                :expires => 20.years.from_now.utc }
    self.current_user = user
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= user_from_remember_token
  end

Ответы [ 4 ]

2 голосов
/ 13 июля 2010

Хорошие новости!Ваш тест rspec обнаружил ошибку!

Ваш метод контроллера

def admin_user
  redirect_to(root_path) unless current_user.admin?
end

вызывается прямо или косвенно действием удаления вашего контроллера.

И admin_user вызывается, когда current_user равен nil.Таким образом, метод admin_user завершается с ошибкой

undefined method `admin?' for nil:NilClass

fix: зависит от того, как admin_user вызывается и используется.Это в фильтре?

Может быть изменено на

def admin_user
  redirect_to(root_path) unless current_user && current_user.admin?
end

# or
def admin_user
  redirect_to(root_path) if current_user && !current_user.admin?
end

в зависимости от ситуации ....

0 голосов
/ 26 мая 2011

У меня была именно эта проблема, и я обнаружил, что основная проблема заключалась в том, что мне не удалось добавить :destroy в before_filter :authenticate в app / controllers / users_controller.rb, как показано ниже (из с перечислением 10.41:

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

0 голосов
/ 13 июля 2010

Вы завершили раздел 9.3.4 Текущий пользователь учебного пособия?Это создает переменную current_user внутри SessionsController посредством включения модуля SessionsHelper.

0 голосов
/ 13 июля 2010

Похоже, ваш объект current_user равен нулю, и он должен быть равен нулю.

Поскольку вы не вошли в систему, то ваш текущий пользователь _uil равен нулю, а затем вы пытаетесь получить nil.admin? так вот почему он не дает ошибки метода.

Вероятно, вы должны переписать свой метод что-то вроде

def admin_user
  redirect_to(root_path) unless current_user || current_user.admin?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...