注意:我已经阅读了这个问题和答案,但由于某些原因,代码对我不起作用.(见下面我得到的错误)
Rails教程第9章练习10要求您:修改[针对用户]的销毁操作,以防止管理员用户自行销毁.(先写一个测试.)
这里棘手的部分是测试它,因为应用程序已经为当前用户隐藏了"删除"链接,因此您必须直接执行http请求.
我让代码工作,并通过删除隐藏当前用户的删除链接的代码来测试它.果然,如果我点击当前登录用户的删除链接,它会重定向我并给我通知消息.
来自users_controller.rb
def destroy
@user = User.find(params[:id])
if current_user?(@user)
redirect_to users_path, notice: "You can't destroy yourself."
else
@user.destroy
flash[:success] = "User destroyed."
redirect_to users_path
end
end
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是在编写测试时会发送删除请求并调用destroy方法.我试过Rspec测试的解决方案,如果没有删除链接,我将在这里复制:
来自user_pages_spec.rb
describe "destroy" do
let(:admin) { FactoryGirl.create(:admin) }
it "should not allow the admin to delete herself" do
sign_in admin
#expect { delete user_path(admin), method: :delete }.should change(User, :count)
expect { delete :destroy, :id => admin.id }.should_not change(User, :count)
end
end
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,我从RSpec得到了这个错误
Failures:
1) …Run Code Online (Sandbox Code Playgroud) 这是你知道如果你知道答案就会让你觉得愚蠢的问题之一,但我不能让这件事情起作用,所以这里就是这样.在railstutorial.org中我试图解决第10章末尾的练习5但是下面的代码有问题,我尝试的每个变体(例如使用'除')都不起作用.如果当前用户不是管理员用户,我只想执行两行代码.我哪里错了?
def destroy
if !current_user.admin?
User.find(params[:id]).destroy
flash[:success] = "User destroyed."
end
redirect_to users_path
end
Run Code Online (Sandbox Code Playgroud)
编辑:我将当前用户与要删除的用户混淆.我正在使用Aditya的代码,我确信它是正确的,但现在我收到一条"无法运行测试"的消息,表明我的测试中存在语法错误(如下).
describe "as an admin user" do
before(:each) do
admin = Factory(:user, :email => "admin@example.com", :admin => true)
test_sign_in(admin)
end
it "should not allow an admin user to destroy himself" do
lambda do
delete :destroy, :id => admin
end.should_not change(User, :count)
end
end
Run Code Online (Sandbox Code Playgroud)