0

我正在尝试使用 Pundit 来验证对一些不需要数据库交互的静态视图的访问:

class StaticController < ApplicationController
    include Pundit
    authorize :splash, :home?

    def home end
end

以下是我的静态策略。该home?策略始终返回 true,因此我应该能够访问主视图。

class StaticPolicy < Struct.new(:user, :static)
    def initialize(user, resource)
        @user = user
        @resource = resource
    end

    def home?
        true
    end
end

相反,我得到了这个:

undefined method `authorize' for StaticController:Class

如果我授权模型,Pundit 可以完美运行:

def forums_index
    @forums = Forum.all
    authorize @forums
end

但是,如果我尝试在不使用模型的操作之外使用授权方法,我会得到:

undefined method `authorize' for StaticController:Class
4

1 回答 1

0

好吧,AFAIK 你总是不得不authorize反对一个对象或一个类,而 CanCan 已经“ load_and_authorize_resource”,当使用 Pundit 时,你已经知道你必须自己加载和授权某些东西(对不起,如果我在这里太明显了)。

也就是说,考虑到您的视图没有数据库交互,在我看来,您的情况的最佳解决方案是对您的用户进行一些自定义授权,例如

class StaticPolicy < Struct.new(:user, :static)
  def initialize(user, resource)
    @user = user
    @resource = resource
  end

  def home?
    authorize @user, :admin # or suppress the second parameter and let the Policy use the 'home?' method
    true
  end
end

在你的UserPolicy东西里

class UserPolicy < ApplicationPolicy
  def admin # or def home?, it's up to you
    user.admin?
  end
end

我没有测试它,但这是主要思想,这有意义吗?清楚吗?

请试一试并发表任何印象,希望对您有所帮助:)

于 2014-09-06T01:59:08.300 回答