将Pundit与命名空间一起使用

Leo*_*Leo 11 ruby-on-rails pundit

在我的项目中,我有相当常见的命名空间"admin".

namespace :admin do
    resources :users, except: :show
end
Run Code Online (Sandbox Code Playgroud)

我使用Pundit gem来设置适当的授权,但我发现在命名空间中使用控制器很困难.我的政策安排如下

-policies
    -admin
        user_policy.rb
    application_policy.rb
    admin_policy.rb
    awesome_policy.rb
Run Code Online (Sandbox Code Playgroud)

与控制器非常相似.

但是,当在控制器内部使用"授权"方法时我只得到一个错误,通知该应用程序"无法找到UserPolicy".我的UserPolicy看起来像这样:

class Admin::UserPolicy < AdminPolicy
end
Run Code Online (Sandbox Code Playgroud)

那么问题是什么,我应该怎样做才能使Pundit在命名空间中看到这些策略?

nch*_*rro 4

简短的回答:您不能让 Pundit 使用控制器命名空间特定的策略。

长答案:Pundit 查看资源(模型)来确定要使用哪个策略类,因此每当您将模型的实例User作为资源传递时,它都会查找UserPolicy,而不是Admin::UserPolicy

请参阅此处此处此处

可以在模型上指定一个策略类User,但这并不能真正解决您的命名空间控制器问题,因为无论您在何处授权,Pundit 都会从模型中派生策略类。