权威:未定义的方法`授权'

时间:2014-09-05 19:41:49

标签: ruby-on-rails pundit

我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

嗯,AFAIK你总是要authorize反对一个对象或一个类,而CanCan已经&#34; load_and_authorize_resource&#34;,当你使用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

我没有测试过,但那是主要的想法,它有意义吗?它清楚了吗?

请试一试并发布任何展示,希望有所帮助:)