2

这个想法是为了让管理员用户不会破坏自己。我写了以下测试:

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]}.

我不明白缺少模板的错误消息,我不明白为什么测试没有通过。

4

1 回答 1

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 存储库的链接以及您当前的代码。

于 2013-02-10T03:34:44.007 回答