Я выполняю учебник Майкла Хартла по Rails (используя Rails 4 и RSpec-Rails 3.3.3) и реализую пользователей с правами администратора, что достигается путем добавления логического атрибута администратора в модель пользователя. Вместо этого я решил использовать двойную модель администратора (у пользователя есть_один администратор; администратор принадлежит пользователю), в которой просто хранится user_id; если идентификатор пользователя существует в таблице, то это администратор (я чувствую, что это будет более эффективным в долгосрочной перспективе, учитывая ожидаемое соотношение администраторов и неадминистраторов).
Предлагается тест пользовательского контроллера, чтобы убедиться, что разрешенные параметры не позволяют редактировать атрибут администратора через Интернет, например, так (пользователь создается в базе данных с помощью Factory Girl):
patch :update, id: user, user: { password: user[:password], password_confirmation: user[:password_confirmation], admin: '1' }
Чтобы проверить свою версию, я попытался выполнить следующий тест RSpec:
context 'attempt to assign non-admin user as admin via update request via web' do
it 'will not update admin status' do
session[:user_id] = user.id # user is logged in as required to make patch request
expect { patch :update, id: user, user: { name: user.name, email: user.email, admin: { user_id: user.id } } }.to change { Admin.count }.by 0
end
end
Этот тест проходит успешно, но не благодаря правильному ограничению разрешенных параметров. Чтобы проверить, работает ли обратное, я хочу проверить, что разрешение параметров администратора в модели пользователя фактически внесет изменения в таблицу администратора.
Я обновил user_controller:
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation, admin: :user_id)
end
И users_controller_spec (проверяет изменение количества администраторов на 1):
context 'attempt to assign non-admin user as admin via update web request' do
it 'will not update admin status' do
session[:user_id] = user.id
expect { patch :update, id: user, user: { name: user.name, email: user.email, admin: { user_id: user.id } } }.to change { Admin.count }.by 1
end
end
Что дает эту ошибку (документы говорят, что она возникает, когда объект, назначенный ассоциации, имеет неправильный тип):
Failure/Error: expect { patch :update, id: user, user: { name: user.name, email: user.email, admin: { user_id: user.id } } }.to change { Admin.count }.by 1
ActiveRecord::AssociationTypeMismatch:
Admin(#70320649341140) expected, got ActionController::Parameters(#70320662053980)
У меня есть ощущение, что я могу иметь это совершенно неправильно: что модель администратора должна обновляться только напрямую, а не через модель пользователя, и, возможно, путем выделения администратора в отдельную модель, подобную этой, чтобы такой злонамеренный запрос на исправление давал статус пользователя-администратора может быть даже невозможен (нет admin_controller или маршрутов администратора, поскольку я ожидаю, что такое назначение будет выполнено на уровне базы данных; только простая модель администратора, в которой указано, что она принадлежит пользователю).
Я был бы очень признателен за совет о том, есть ли тест, который я должен написать, учитывая мои обстоятельства.
Заранее спасибо.