Почему действия, ориентированные на сферу (особенно действия с индексами), трактуются по-разному в Pundit?

Я пишу по отношению кhttps://github.com/elabs/pundit#scopes

У меня сложилось впечатление, чтоавторизация должен ответить на вопросВам разрешен доступ к этому ресурсу?то естьtrue/false ответ. Это касается всех действий, кромеindexкоторый, согласно документам Pundit, должен возвращать разныеActiveRecord::Relationв зависимости от того, кто спрашивает. Например,админ получаетscope.allв то время какобычный пользователь получаетscope.where(:published => true).

приложение / политика / post_policy.rb

class Scope < Struct.new(:user, :scope)
  def resolve
    if user.admin?
      scope.all
    else
      scope.where(:published => true)
    end
  end
end

приложение / контроллеры / posts_controller.rb

def index
  @posts = policy_scope(Post)
end

Моя оговорка заключается в том, что это скользкий уклон, и вскоре я добавлю презентацию в области видимости (например,scope.all.order('created_at ASC')) - и это просто страннополитика авторизации.

Конечно, я могу перенести это на контроллер ...

def index
    @post = policy_scope(post)
    if user.admin?
        @post = @post.order( 'created_at ASC' )
    end
end

... но это работа контроллера? И я не думаю, что было бы правильно добавить такой вызов в представление. Так может быть это должен быть модельный метод?

Что бы вы сказали о плюсах / минусах следующих действий?

приложение / контроллеры / posts_controller.rb

Это держитindex как и другие методы, с одним вызовомauthorizeи один вызов метода модели.

def index
  authorize(Post)
  @posts = Post.index(current_user)
end

приложение / политика / post_policy.rb

Это просто дает верный / ложный ответ. Вы авторизованы? Да или нет.

def index?
    user.admin? || user.regular_user?
end

приложение / модели / post.rb

И в модели мы можем получить столько фантазии, сколько захотим.

def self.index(user)
  if user.admin?
    Post.all.order('created_at ASC')
  else
    Post.where(user_id: user.id)
  end
end

Мысли?

Ответы на вопрос(1)

Ваш ответ на вопрос