2014-09-05 3 views
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 

Пандит отлично работает, если я санкционирование модели:

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

Однако, если я пытаюсь использовать метод Авторизоваться вне действие, которое не использует модель, которую я получаю:

undefined method `authorize' for StaticController:Class 

ответ

0

Ну, AFAIK, вы всегда будете иметь authorize против объекта или класса, а CanCan уже «load_and_authorize_resource», при использовании Pundit вы уже знаете, что вам нужно самому загрузить и авторизовать (извините, если я тоже очевидно здесь).

Это говорит и учитывая, что ваша точка зрения не имеет DB Интерактивного, мне кажется, что лучшее решение для Вашего случая, это сделать некоторые пользовательские разрешения от вашего пользователя, что-то вроде

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 

Я не проверял, но это основная идея, это имеет какой-то смысл? Так понятно?

Просьба присылать любые впечатления, надеюсь, что это поможет :)

Смежные вопросы