У меня есть приложение rails 3.1, использующее Devise и CanCan для управления пользователями и ролями. Я хочу убедиться, что пользователи могут обновить свой пароль, но не свои роли. (Таким образом, обычные пользователи не могут назначить себя администратором). Я переопределил класс Devise "RegistrationsController" с помощью следующего кода:
def update
# this is my attempt to stop people from updating their roles
# and giving themselves "Admin" priveledges.
params.delete("role_ids")
super
end
Я надеюсь, что это помешает хакерам обновить поле "role_ids" в пользователе, чтобы изменить свои привилегии. (Если есть лучший способ добиться этого, скажите, пожалуйста!) Моя проблема в том, что я не могу написать спецификацию, которая проверит работоспособность этого кода. Моя спецификация выглядит так:
require 'spec_helper'
describe RegistrationsController do
before (:each) do
@user = Factory(:user)
sign_in @user
end
it "should update the user attributes but not the roles" do
user_params = {"name" => "new_name", "role_ids" => ["2"],}
put :update, { :id => @user.id, :user => user_params}
@user = User.find(@user.id)
@user.name.should == "new_name"
@user.roles.should be_empty
end
end
Проблема в том, что этот тест не выполняется. Я получаю сообщение об ошибке, подобное этому:
Failures:
1) RegistrationsController should update the user attributes but not the roles
Failure/Error: put :update, { :id => @user.id, :user => user_params}
AbstractController::ActionNotFound:
Could not find devise mapping for path "/user?id=29&user%5Bname%5D=new_name&user%5Brole_ids%5D%5B%5D=2".
Maybe you forgot to wrap your route inside the scope block? For example:
devise_scope :user do
match "/some/route" => "some_devise_controller"
end
# ./spec/controllers/registrations_controller_spec.rb:13:in `block (2 levels) in <top (required)>'
Я не понимаю, что сообщение об ошибке просит меня сделать. Мои маршруты кажутся хорошими, и мое приложение, кажется, работает иначе. Кто-нибудь может помочь?