Почему действия, ориентированные на сферу (особенно действия с индексами), трактуются по-разному в Pundit?
Я пишу по отношению кhttps://github.com/elabs/pundit#scopes
У меня сложилось впечатление, чтоавторизация должен ответить на вопросВам разрешен доступ к этому ресурсу?т.е.true
false
ответ. Это касается всех действий, кромеindex
, который, по словам Пундитьдокументы должны возвращать разные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
Мысли?