Rails和ActiveAdmin before_destroy不会停止销毁操作

时间:2016-10-28 20:25:23

标签: ruby-on-rails ruby activeadmin

使用Rails 4.2.4和ActiveAdmin 1.0.0.pre4。

在ActiveAdmin用户信息中心,我需要检查用户是否有权在用户点击AA提供的默认Delete链接时删除其他用户。这就是我目前在app/admin/user.rb中所拥有的:

  controller do

    before_destroy :check_if_user_can_destroy

    def check_if_user_can_destroy(resource)
      if current_user == resource || current_user.level < resource.level
        puts "plz stop"
        return false
      end
    end

  end

当我删除某些我无法删除的人时,文本“plz stop”会输出到控制台,但删除操作仍会发生,并且用户会被删除。

根据我的阅读,在false操作中返回before应该会停止后续操作的运行,这是不正确的?

更新1

我改变了一些事情并且结束了这一点,这似乎有效......但我不相信它还有某种原因。我好吗?这样做有什么明显的“陷阱”吗?

当然还在app/admin/user.rb

  controller do

    def destroy
      if current_user == resource || current_user.level < resource.level
        redirect_to "/admin/users"
      else
        resource.destroy
      end
    end

  end

2 个答案:

答案 0 :(得分:1)

before_destroy不能中止破坏,它只在破坏之前运行代码。例如,发送通知邮件或类似的东西。

你的覆盖是安全的工作!

但是,您在覆盖中所做的更好地放置在身份验证系统中(例如cancancanpundit)。 Here您可以在ActiveAdmin中找到如何使用它们。

答案 1 :(得分:0)

您可以中止:

  • Rails 5:throw :abort
  • Rails 4:return false

in before_destroy hook。

请注意,您应该在任何操纵挂钩之前放置中止挂钩,例如dependent: :destroy