嵌套Pundit政策?

时间:2014-10-22 18:43:24

标签: ruby-on-rails-4 pundit

假设我有一个属于User模型的Document模型。用户has_many文件。 DocumentPolicy可能包含此内容......

def edit?
  document.user_id == user.id
end

但是,如果......编辑文档,您还必须能够编辑父文件(用户)。然后,该政策可能如下所示。

def edit?
  document.user_id == user.id &&
  policy(user).edit?
end

这会导致错误:

undefined method `policy' for #<DocumentPolicy

我很好奇是否有更好的方法来做到这一点。我不正确地接近它吗?这似乎是其他人想要做的事情......所以,我希望能够深入了解其他人如何接近这一点。

2 个答案:

答案 0 :(得分:4)

你有正确的想法,你只需要通过权威类明确地调用它:

def edit?
  # I am assuming that a user can edit themselves, so the "or" is in there, if not, go back to using and
  document.user_id == user.id or UserPolicy.new(user, User.find(document.user_id)).edit?
end

那应该能给你你想要的东西。

答案 1 :(得分:0)

在Document Controller中,声明用户变量并授权该用户。

def edit
  @document = Document.find(params[:id])
  @user = User.find(@document.user_id)  #or how you define it
  authorize @user
end

然后专家会查看您的用户政策以进行编辑?方法

**编辑有关错误消息,它表示您的文档模型没有与之关联的策略文件。如果您查看您的策略文件夹,您应该看到user_policy.rb但不是document_policy.rb(app / controllers / policies)