嵌套的Pundit政策?

hel*_*ion 1 ruby-on-rails-4 pundit

说我有一个属于用户模型的文档模型。用户has_many文档。DocumentPolicy可能包括此...

def edit?
  document.user_id == user.id
end
Run Code Online (Sandbox Code Playgroud)

但是,如果...要编辑文档怎么办,您还必须能够编辑该文档的父级(用户)。然后,该策略可能如下所示。

def edit?
  document.user_id == user.id &&
  policy(user).edit?
end
Run Code Online (Sandbox Code Playgroud)

这导致错误:

undefined method `policy' for #<DocumentPolicy
Run Code Online (Sandbox Code Playgroud)

我很好奇是否有更好的方法可以做到这一点。我处理不正确吗?似乎其他人会想做的事情……所以,我希望能对其他人如何做到这一点有所了解。

小智 5

您有正确的想法,您只需要通过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
Run Code Online (Sandbox Code Playgroud)

那应该给你你想要的。