Ruby on rails Pundit:将特定资源授权给不同名称的控制器

Ruby on rails Pundit:将特定资源授权给不同名称的控制器,ruby-on-rails,ruby,pundit,Ruby On Rails,Ruby,Pundit,假设我使用的是授权。我有以下控制器: class BlogsController < ApplicationController before_action :check_authorization ... private def check_authorization authorize :blog end end 再说一次,没问题。Pundit查看资源的类,Blog,然后查找BlogPolicy类 示例:应用程序可以调用BlogPolicy#show?

假设我使用的是授权。我有以下控制器:

class BlogsController < ApplicationController
  before_action :check_authorization
  ...

  private
  def check_authorization
    authorize :blog
  end
end
再说一次,没问题。Pundit查看资源的类,
Blog
,然后查找
BlogPolicy

  • 示例:应用程序可以调用
    BlogPolicy#show?
    方法并传入
    @blog
    资源
问题是:当我想对特定控制器名称进行授权并对特定资源进行授权,但该资源不与控制器名称同步时,我该怎么办

例如:

class SomeOtherBlogsController < ApplicationController
  before_action :check_authorization
  ...

  private
  def check_authorization
    authorize :some_other_blog, @blog
  end
end

但是,调用该函数会引发一个
Pundit::AuthorizationNotPerformedError
。因此,与仅返回
true
false
相比,在
authorize
方法中发生的事情似乎更多

您可以通过以下方式手动指定模型的资源类:

class Blog
  def self.policy_class
    SomeOtherBlogPolicy
  end
end
不幸的是,在调用
authorize
时,无法从控制器指定策略类

我最初写答案时是这样的。v2.00添加了一个
策略\u类
选项以授权:

authorize(@blog, policy_class: SomeOtherBlogPolicy)

因此,不再需要原始答案中的解决方法。

您可以通过以下方式手动指定模型的资源类:

class Blog
  def self.policy_class
    SomeOtherBlogPolicy
  end
end
不幸的是,在调用
authorize
时,无法从控制器指定策略类

我最初写答案时是这样的。v2.00添加了一个
策略\u类
选项以授权:

authorize(@blog, policy_class: SomeOtherBlogPolicy)

因此,不再需要我原始答案中的解决方法。

这现在是Pundit版本
2.0.0中的内置功能。
文档更新如下:

如有必要,可以传递参数以重写策略类。例如:


这现在是Pundit版本
2.0.0中的内置功能。
文档更新如下:

如有必要,可以传递参数以重写策略类。例如:


是否也可以覆盖视图中的策略类?我尝试这样做,但出现了一个错误
unknown关键字::policy\u class

<% if policy(@publication, policy_class: PublicationPolicy).create? %>

是否也可以覆盖视图中的策略类?我尝试这样做,但出现了一个错误
unknown关键字::policy\u class

<% if policy(@publication, policy_class: PublicationPolicy).create? %>


既然可以用“authorize@publication,policy”覆盖,既然可以用“authorize@publication,policy\u class:PublicationPolicy”覆盖,我不确定这是否能解决您的用例,但我做的一件事是:
。基本上:我将自定义策略放在
ApplicationPolicy
中,它可以从我的所有其他策略中访问,因为它们都继承自
ApplicationPolicy
。当然,问题是如果您的授权是基于实际的
@发布记录的,那么这对您不起作用。我不确定这是否能解决您的用例,但我做的一件事是:
。基本上:我将自定义策略放在
ApplicationPolicy
中,它可以从我的所有其他策略中访问,因为它们都继承自
ApplicationPolicy
。当然,问题是,如果您的授权基于实际的
@出版物
记录,那么这将不适用于您。