我正在尝试使用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
答案 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
我没有测试过,但那是主要的想法,它有意义吗?它清楚了吗?
请试一试并发布任何展示,希望有所帮助:)