Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails可以使用gem重构能力类_Ruby On Rails_Ruby_Ruby On Rails 4_Rubygems_Cancan - Fatal编程技术网

Ruby on rails Rails可以使用gem重构能力类

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的建议,他将这

我的rails应用程序中有大约13个模型,我在所有模型上都使用了该功能。我的能力班越来越大了。我在不同的积垢动作上有不同的能力条件,这使得管理起来很困难


有人能指导我如何重构这个..吗。。?比如,使用模块或类使我的能力类看起来整洁

您只需将您的能力类转移到数据库,并在那里管理所有权限,然后在检查当前用户执行操作的能力之前获取。将权限移动到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继承来添加所需的逻辑