Ruby on rails Rails可以使用gem重构能力类
我的rails应用程序中有大约13个模型,我在所有模型上都使用了该功能。我的能力班越来越大了。我在不同的积垢动作上有不同的能力条件,这使得管理起来很困难Ruby on rails Rails可以使用gem重构能力类,ruby-on-rails,ruby,ruby-on-rails-4,rubygems,cancan,Ruby On Rails,Ruby,Ruby On Rails 4,Rubygems,Cancan,我的rails应用程序中有大约13个模型,我在所有模型上都使用了该功能。我的能力班越来越大了。我在不同的积垢动作上有不同的能力条件,这使得管理起来很困难 有人能指导我如何重构这个..吗。。?比如,使用模块或类使我的能力类看起来整洁 您只需将您的能力类转移到数据库,并在那里管理所有权限,然后在检查当前用户执行操作的能力之前获取。将权限移动到db中不会花费太多时间。Simple Escnario:如果您可以将权限拆分为几个相互排斥的集合,然后你应该检查一下CanCan创建者@ryanb的建议,他将这
有人能指导我如何重构这个..吗。。?比如,使用模块或类使我的能力类看起来整洁 您只需将您的能力类转移到数据库,并在那里管理所有权限,然后在检查当前用户执行操作的能力之前获取。将权限移动到db中不会花费太多时间。Simple Escnario:如果您可以将权限拆分为几个相互排斥的集合,然后你应该检查一下CanCan创建者@ryanb的建议,他将这些能力分成几个不同的类,然后覆盖
应用程序控制器中的当前能力
方法
更复杂的场景:如果您有多个不同的重叠权限集,可以尝试以下方法:
# app/models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
self.merge Abilities::Everyone.new(user)
if user
self.merge Abilities::Admin.new(user) if user.admin?
self.merge Abilities::Authenticated.new(user)
else
self.merge Abilities::Guest.new(user)
end
end
end
# app/models/abilities/admin.rb
module Abilities
class Admin
include CanCan::Ability
def initialize(user)
# define abilities here ...
end
end
end
# app/models/abilities/everyone.rb
...
其他文件也是如此。这里提到的部分解决方案非常吸引人。我想提出一种处理此问题的替代方法,其中我们覆盖应用程序控制器中的当前能力方法,使其根据所使用的控制器而动态。从那里我们可以指定在每个控制器中使用的能力。它可能看起来像这样:
./app/abilities
./posts_ability.rb
./comments_ability.rb
./admin_ability.rb
./pictures_ability.rb
./uploads_ability.rb
class MyController < ApplicationController
authorize_with PostsAbility
end
然后在./app/controllers/my_controller.rb中,它将如下所示:
./app/abilities
./posts_ability.rb
./comments_ability.rb
./admin_ability.rb
./pictures_ability.rb
./uploads_ability.rb
class MyController < ApplicationController
authorize_with PostsAbility
end
class MyController
在PostsController默认情况下使用PostsAbility的情况下,它也可能会自动结束
然而,回想起来,还有一件事要考虑。似乎有两种方法来衡量这些能力。一方面,我们可能有许多“角色”,允许它们以不同的方式与数据交互。另一种方法是,我们有许多模型,需要一种方法将逻辑拆分到那里。这种方法对这两种方法都很有效,因为您可以根据正在(或可能)采取的行动来划分逻辑
还有一件事,我们也可以使用继承来预加载相互依赖的能力。如果注释属于Post,那么注释性可以从PostsAbility继承来添加所需的逻辑