Част от решението, споменато тук, е наистина привлекателно. Бих искал да предложа алтернативен метод за справяне с това, където заместваме метода 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