Часть решения, упомянутого здесь, действительно привлекательна. Я хотел бы предложить альтернативный метод для обработки этого, где мы переопределяем метод current_ability в application_controller, чтобы сделать его динамическим в зависимости от используемого контроллера. Оттуда мы можем указать возможность использования в каждом контроллере. Это может выглядеть примерно так:
./app/abilities
./posts_ability.rb
./comments_ability.rb
./admin_ability.rb
./pictures_ability.rb
./uploads_ability.rb
Тогда в ./app/controllers/my_controller.rb это будет выглядеть так:
class MyController < ApplicationController
authorize_with PostsAbility
end
Это также может быть автоматическим, когда PostsController будет использовать PostsAbility по умолчанию.
Однако, оглядываясь назад, есть одна вещь, которую следует учитывать. Кажется, есть два способа масштабировать способности. С одной стороны, у нас может быть много «ролей», которым разрешено по-разному взаимодействовать с данными. Другой способ заключается в том, что у нас есть много моделей, и нам нужен способ разделить логику там. Этот подход хорошо работает с обоими из них, потому что вы можете разделить логику на основе действия, которое выполняется (или может быть выполнено).
Еще одна вещь: мы также можем использовать наследование для предварительной загрузки взаимозависимых способностей. Если Comment принадлежит Post, то CommentsAbility может наследоваться от PostsAbility, чтобы добавить необходимую логику.
person
William Hatt
schedule
13.12.2015