Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用带命名空间的Pundit_Ruby On Rails_Pundit - Fatal编程技术网

Ruby on rails 使用带命名空间的Pundit

Ruby on rails 使用带命名空间的Pundit,ruby-on-rails,pundit,Ruby On Rails,Pundit,在我的项目中,我有一个非常常见的名称空间“admin” 我使用Pundit gem来设置适当的授权,但我发现很难在命名空间中使用控制器。我的政策安排如下 -policies -admin user_policy.rb application_policy.rb admin_policy.rb awesome_policy.rb 非常类似于控制器 然而,当我在控制器中使用“authorize”方法时,我只得到一个错误,通知应用程序“找不到UserP

在我的项目中,我有一个非常常见的名称空间“admin”

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

-policies
    -admin
        user_policy.rb
    application_policy.rb
    admin_policy.rb
    awesome_policy.rb
非常类似于控制器

然而,当我在控制器中使用“authorize”方法时,我只得到一个错误,通知应用程序“找不到UserPolicy”。我的用户策略如下所示:

class Admin::UserPolicy < AdminPolicy
end
class Admin::UserPolicy

那么问题是什么,我应该怎么做才能让Pundit看到命名空间内的那些策略呢?

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

详细回答:Pundit查看资源(模型)以确定要使用的策略类,因此,每当您将
User
模型的实例作为资源传入时,它都会查找
UserPolicy
,而不是
Admin::UserPolicy

看,还有

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

使用新的合并,您可以这样做

它会自动工作

更新:

从0.3版本有效删除,无需更换功能。但是,可以在上的命名空间分支中获取命名空间功能

您可以在中看到功能的讨论


我的建议是,对于那些希望与权威人士一起使用名称空间的人,暂时不要使用。在筛选之前进行筛选,以访问限制区域,如管理仪表板,并将授权模型规则保留在权威文件中。这样,您就可以使用pundit,而不会出现任何问题。

虽然onemanstartup提到现在应该可以自动运行,但我无法让名称空间策略正常运行,但以下是我认为可以接受的

在您的例子中,在AdminPolicy中,我添加了自定义操作名称,如

def new_user?
  some code
end
然后在我的Admin::UserController#新操作中

def new
  authorize @user, :new_user?
end

只是因为同样的问题才来这里。使用pundit v2.1.0,这可以通过覆盖控制器中的
策略范围
授权
实现。我对类似设置所做的操作:

module Admin
  class ModuleController < ModuleController
    private

    def policy_scope(scope)
      super([:admin, scope])
    end

    def authorize(record, query = nil)
      super([:admin, record], query)
    end
  end
end
模块管理
类ModuleController
然后,只需使用控制器中处理策略的常用方法,它将从
Admin
命名空间中获取策略

自述文件中也介绍了这一点


如果您需要更多的上下文而不仅仅是当前用户和记录,将非常有用。

出色的工作!修正了一个我一直被卡住的问题!干得好@dminor使用最新版本时,它不再工作。但是我用了一把叉子,它对我很有用。
module Admin
  class ModuleController < ModuleController
    private

    def policy_scope(scope)
      super([:admin, scope])
    end

    def authorize(record, query = nil)
      super([:admin, record], query)
    end
  end
end