【问题标题】:how to prevent a DELETE HTTP request from succeeding in this situation?在这种情况下如何防止 DELETE HTTP 请求成功?
【发布时间】:2012-04-04 11:22:04
【问题描述】:

Rails 初学者在这里..

我有一个用户资源,我在其中实现了一个回调,该回调应该防止管理员用户删除自己。

before_filter :admin_no_delete,    only: :destroy

def admin_no_delete 
  admin_id = current_user.id if current_user.admin?
  redirect_to root_path if params[:id] == admin_id 
end      

如果这对某些人来说看起来很熟悉,它来自 Michael Hartl 的 rails 教程,exercise #10 here,但我尝试以不同的方式进行操作,而不是按照他的建议。

我的(蹩脚的)测试失败了

    describe "deleting herself should not be permitted" do
      before do
        delete user_path(admin) 
      end
      it { should_not redirect_to(users_path) }
    end

但是为管理员用户公开一个删除链接只是为了测试并单击该链接,看起来回调实际上成功执行(重定向到 root_path)。

我能够使用 jQuery 调用销毁操作来删除受回调保护的记录(使用 Web Inspector 的 javascript 控制台):

$.ajax({url: 'http://localhost:3000/users/104', type: 'DELETE', success: function(result){alert(result)} })

寻找关于如何防止 DELETE HTTP 请求在这种情况下成功的想法。还有关于如何正确测试这种情况的任何想法?

谢谢。

【问题讨论】:

  • 测试测试什么?删除成功后不重定向吗?
  • Userid 104 是否真的从数据库中删除?
  • @FrederickCheung - 谢谢,我意识到我的错误在那里......删除重定向到 users_path 所以应该是一个不应该......在这种情况下,测试实际上失败了
  • @Aldo'xoen'Giambelluca - 是的,用户 id 104 已从数据库中删除
  • 根据@FrederickCheung 的评论编辑的问题..

标签: ruby-on-rails


【解决方案1】:

简单:params[:id] 是一个字符串,而admin_id 是一个 Fixnum。您可以按如下方式更改它,它应该可以工作:

redirect_to root_path if params[:id].to_i == admin_id

不过,您使用的逻辑对我来说似乎有点奇怪。如果仅用于一项操作,为什么要使用 before 过滤器,为什么要更改重定向?我认为逻辑应该直接在销毁动作中,看起来像这样:

def destroy
  unless current_user.admin? && current_user.id == params[:id].to_i
    User.find(params[:id]).destroy
    flash[:success] = "User destroyed."
  end
  redirect_to users_path
end

【讨论】:

  • 非常感谢。该教程实际上是建议将其放在销毁操作本身中。我太菜鸟了,无法弄清楚——显然这个错误表明了这一点。我不认为我写的测试是一个好的测试。希望有任何改进它的提示。
  • 对于销毁操作,我认为最好的方法是检查数据库更改(或者在您的情况下是否不存在)。我有时会这样做:lambda{ delete user_path(admin) }.should change{User.count}.by(0)
  • 我想过检查计数,但不知道如何在这种情况下实现它。非常感谢您的帮助!
【解决方案2】:

您将admin_id(一个整数)与params[:id] 进行比较。 params 中的值始终是字符串(或包含更多字符串的数组/哈希),因此比较总是会失败。

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2013-02-11
    • 1970-01-01
    相关资源
    最近更新 更多