2

假设我有一个属于 User 模型的 Document 模型。A User 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

我很好奇是否有更好的方法来做到这一点。我是否错误地接近它?这似乎是其他人会想到做的事情......所以,我希望能深入了解其他人是如何解决这个问题的。

4

2 回答 2

8

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

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

那应该给你你想要的。

于 2014-10-24T17:38:21.133 回答
0

在您的文档控制器中,声明用户变量并授权该用户。

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

然后权威人士会在您的用户策略中查找编辑?方法。

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

于 2014-10-22T18:45:44.920 回答