这个想法是为了让管理员用户无法自我毁灭。 我写了以下测试:
describe "as admin user" do
let(:admin) { FactoryGirl.create(:admin) }
before { valid_signin admin }
describe "should not be able to delete himself by submitting a DELETE request to the Users#destroy action" do
specify do
expect { delete user_path(admin) }.not_to change(User, :count).by(-1)
end
end
end
并修改了破坏行动:
def destroy
@user = User.find(params[:id])
unless current_user?(@user)
User.find(params[:id]).destroy
flash[:success] = "User destroyed."
redirect_to users_url
end
end
(如果您是管理员用户,则只能访问销毁操作。)
测试现在应该通过,但事实并非如此。我收到以下错误消息:
Failure/Error: expect { delete user_path(admin) }.not_to change(User, :count).by(-1)
ActionView::MissingTemplate:
Missing template users/destroy, application/destroy with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}.
我不明白丢失的模板错误消息,我不明白为什么测试没有通过。
答案 0 :(得分:5)
尝试将destroy
操作更改为此类操作,并查看测试是否通过:
def destroy
user = User.find(params[:id])
unless current_user?(user)
user.destroy
flash[:success] = "User destroyed."
else
flash[:error] = "You can't destroy yourself."
end
redirect_to users_url
end
我认为问题在于,如果您成功销毁用户,则只会重定向到users_url
。如果你不这样做(即管理员试图破坏自己),那么就没有重定向,Rails将开始寻找一个名为 destroy.html.erb 的视图,而不是在任何地方找到一个,举一个例外。这也是方法中的用户变量从@user
更改为user
的原因:局部变量将代替实例变量,因为它不需要在视图中使用。
如果这不是问题,请编辑您的问题,以包含指向当前代码的Github仓库的链接。