У меня есть плохая привычка отвечать на мои собственные вопросы, но я даю реквизиты @jpemberthy и @Austin Taylor за то, что они указали мне правильное направление. Сначала (и это косметика) я добавил это в свою модель User:
class User
...
def self.create_guest
self.new
end
def guest?
uninitialized?
end
end
и очистил мою модель способностей соответственно:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.create_guest
if (user.admin?)
<admin abilities here>
elsif (user.guest?)
<guest abilities here>
else
<regular user abilities here>
end
end
end
Но настоящее исправление было в моих тестах RSpec. Так как у пользователя есть проверки в полях электронной почты и пароля, мой оригинальный код:
before(:each) do
@user = User.create
end
терпел неудачу, создавая неинициализированный @user
. Поскольку поле: id было ноль, предложение Ability:
can(:manage, User, :id => user.id)
успешно с гостевым пользователем, потому что nil == nil (если это имеет смысл). Добавление обязательных полей для удовлетворения пользовательских проверок сделало (почти) все работает.
Мораль: так же, как @jpemberthy предлагает в своем коде, всегда включайте тест, чтобы убедиться, что ваши пользовательские объекты имеют привилегии, которые они должны! (У меня все еще есть другой вопрос, касающийся CanCan, который, как мы надеемся, менее умен, чем этот, который появляется в ближайшей к вам теме StackOverflow ...)