Знаток: неопределенный метод "авторизовать"

Я пытаюсь использовать 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

person Starkers    schedule 05.09.2014    source источник


Ответы (1)


Ну, насколько я знаю, вам всегда придется 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

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

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

person Miguelgraz    schedule 06.09.2014