首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对同一用户使用cancancan的不同规则

对同一用户使用cancancan的不同规则
EN

Stack Overflow用户
提问于 2018-01-30 21:28:11
回答 1查看 38关注 0票数 0

我是rails的新手,在这里我有一个可怕的疑问,我正在开发,我发现我创建的规则将不再起作用。我用的是可逆罐。

假设我要在模块中进行开发,以便于交付和开发。目前只有一个模块可用,已经为这个模块定义的规则工作得很好,但当我交付另一个模块时,它们将不是同一用户的相同规则。

代码语言:javascript
复制
enum kind: {
        User: 1,
        Editor:2,
        Admin: 3       
    }
    enum charge: {
        Auxiliary: 1,
        Analyst: 2,
        Coordinator: 3
    }
    enum print: {
        No: 0,
        Yes 1
    }

这些是目前可用的选项,这是针对与文档模型相关的用户模型的。但是,当我创建一个模型测试,即规则与文档完全不同时,我是否必须复制用户规则才能定义?

代码语言:javascript
复制
enum kind_test: {
        User: 1,
        Editor:2,
        Admin: 3
    }
    enum charge_test: {
        Auxiliary: 1,
        Analyst: 2,
        Coordinator: 3
    }
    enum print_test: {
        No: 0,
        Yes 1
    }

当我创建另一个模块时,我是否必须再次复制?我在用户中的规则永远是这些种类、收费和打印,变化的是不同型号的能力。

我的能力

代码语言:javascript
复制
if user.kind == 'Admin'
    can: manage,: all
end
if user.kind == 'User'
    if user.print == 'Yes'
        can: view, Pop
        if user.charge == 'Auxiliary'
            can [: index_pdf,: show,: read,: view,: index], Pop, status: 0, charge: 1
        end
        if user.charge == 'Analyst'
            can [: index_pdf,: show,: read,: view,: index], Pop, status: 0, charge: 1
            can [: index_pdf,: show,: read,: view,: index], Pop, status: 0, charge: 2
        end
        if user.charge == 'Coordinator'
            can [: index_pdf,: show,: read,: view,: index], Pop, status: 0, charge: 1
            can [: index_pdf,: show,: read,: view,: index], Pop, status: 0, charge: 2
            can [: index_pdf,: show,: read,: view,: index], Pop, status: 0, charge: 3
        end
    else
        can: view, Pop
        if user.charge == 'Auxiliary'
            can [: show,: read,: view,: index], Pop, status: 0, charge: 1
        end
        if user.charge == 'Analyst'
            can [: show,: read,: view,: index], Pop, status: 0, charge: 1
            can [: show,: read,: view,: index], Pop, status: 0, charge: 2
        end
        if user.charge == 'Coordinator'
            can [: show,: read,: view,: index], Pop, status: 0, charge: 1
            can [: show,: read,: view,: index], Pop, status: 0, charge: 2
            can [: show,: read,: view,: index], Pop, status: 0, charge: 3
        end
    end
end
if user.kind == 'Editor'
    can: view, Pop
    if user.charge == 'Auxiliary'
        can [: index_pdf,: show,: read,: view,: index,: edit], Pop, status: 0, charge: 1
    end
    if user.charge == 'Analyst'
        can [: index_pdf,: show,: read,: view,: index,: edit], Pop, status: 0, charge: 1
        can [: index_pdf,: show,: read,: view,: index,: edit], Pop, status: 0, charge: 2
    end
    if user.charge == 'Coordinator'
        can [: index_pdf,: show,: read,: view,: index,: edit], Pop, status: 0, charge: 1
        can [: index_pdf,: show,: read,: view,: index,: edit], Pop, status: 0, charge: 2
        can [: index_pdf,: show,: read,: view,: index,: edit], Pop, status: 0, charge: 3
    end
end
EN

回答 1

Stack Overflow用户

发布于 2018-01-31 06:00:07

这样如何:

代码语言:javascript
复制
  if user.kind == 'Admin'
    can: manage,: all
    return
  end

  pop_permissions = pop_permissions_to_apply

  can :view, Pop
  can(pop_permissions, Pop, status: 0, charge: 1)
  if user.charge == 'Analyst' || user.charge == 'Coordinator'
    can(pop_permissions, Pop, status: 0, charge: 2)
  end
  if user.charge == 'Coordinator'
    can(pop_permissions, Pop, status: 0, charge: 3)
  end

#####
def pop_permissions_to_apply 
  permissions = [:show, :read, :view, :index]
  user_that_can_print = user.kind == 'User' && user.print == 'Yes'
  if user_that_can_print || user.kind == 'Editor'
    permissions.push :index_pdf
  end
  if user.kind == 'Editor'
    permissions.push :edit
  end
  permissions
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48522616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档