gpt4 book ai didi

ruby-on-rails - RoR : Different user roles for each new created record?

转载 作者:行者123 更新时间:2023-12-04 06:34:58 24 4
gpt4 key购买 nike

我想做一个记录管理系统。系统将有 4 个不同的用户角色:Admin , Viewer , EditorReviewer .

而前两个使用 gems 很容易实现,比如 康康 声明性授权 ,另外两个就没那么简单了。

基本上每条新记录都是由 Admin 创建的。 (只有管理员可以创建新记录),并且应该有自己独立的 EditorReviewer角色。也就是说,可以为用户分配不同记录上的许多不同角色,但不能为其他记录分配许多不同的角色,因此可能为用户分配了 Editor记录 A 和 C 但不是 B 等的角色。

  • 编辑器:可以对记录进行修改,并且可以访问 Controller 中的特定方法,例如编辑等。
  • 审阅者:将能够审阅(查看更改)记录并批准或提交评论并拒绝。
  • 查看器:只能查看每条记录的最新批准版本。

  • 有没有办法处理这种特定于记录的用户角色?

    最佳答案

    这可以通过康康 gem 和方块条件轻松完成。块条件检查针对实例的授权。假设您的 Record 类有一个 editors 方法,该方法返回一组授权编辑器,则更新 Record 的 cancan 功能可能如下所示:

    class Ability
    include CanCan::Ability

    def initialize(user)
    user ||= User.new # guest user (not logged in)

    ...

    can :update, Record do |record|
    record.editors.include?(user)
    end

    ...

    end
    end

    请参阅 CanCan wiki 上的“阻止条件”:
    https://github.com/ryanb/cancan/wiki/Defining-Abilities

    更新

    根据您的特定需求,可以通过多种方式存储哪些用户对哪些记录具有哪些访问权限。一种方法可能是创建这样的模型来存储角色分配:
    class UserRecordRoles < ActiveRecord::Base
    # Has three fields: role, user_id, record_id
    attr_accessible :role, :user_id, :record_id
    belongs_to :user_id
    belongs_to :record_id
    end

    现在在 User 和 Record 模型中创建一个 has_many 关联,以便可以轻松查询所有角色分配。编辑器方法可能如下所示:
    class Record < ActiveRecord::Base

    ...

    has_many :user_record_roles

    def editors
    # This is rather messy and requires lot's of DB calls...
    user_record_roles.where(:role => 'editor').collect {|a| a.user}
    # This would be a single DB call but I'm not sure this would work. Maybe someone else can chime in? Would look cleaner with a scope probably.
    User.joins(:user_record_roles).where('user_record_roles.role = ?' => 'editor')
    end

    ...

    end

    当然,有很多方法可以做到这一点,并且根据您的需要而有很大差异。这个想法是 CanCan 可以在确定授权时与您的模型对话,这意味着您可以想象的任何逻辑都可以表示。希望这可以帮助!

    关于ruby-on-rails - RoR : Different user roles for each new created record?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4981947/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com