Ruby CanCanCan 动态定义方法

2024-03-08 10:44

本文主要是介绍Ruby CanCanCan 动态定义方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

灵感来自这里https://github.com/kristianmandrup/cantango/wiki/CanCan-vs-CanTango

如果权限不多,我们可以通过这种方式来定义

class CanCan::Abilitydef initialize user, options = {}if !usercan :read, :allendif useradmin_rules if user.roles.include? :admineditor_rules if user.roles.include? :editordefault_rulesendenddef admin_rulescan :manage, :allenddef editor_rulescan :manage, [Article, Post]end
end

改的灵活点

class CanCan::Abilitydef initialize user, options = {}user ? user_rules : guest_user_rulesenddef user_rulesuser.roles.each do |role|exec_role_rules(role) if user.roles.include? roleenddefault_rulesenddef exec_role_rules rolemeth = :"#{role}_rules"send(meth) if respond_to? methend# various rules methods for each roledef admin_rulescan :manage, :allenddef editor_rulescan :manage, [Article, Post]end...def default_rulescan :read, :allend
end

上面是原文出处,实际使用的时候还是不方便,我改成这样了(非一比一还原)。使用define_method 定义那个每个方法:

class Abilityinclude CanCan::Ability@@permissions = xxxdef initialize(user)@user= user|| User.new@user.roles.each do |role|exec_role_rules(role) if @user.has_role?(role)endendRole.all.each do |role|define_method "rules_#{role.name.gsub(" ", "_")}" dorole_permissions = RolePermission.where(role_id: role.id)unless role_permissions.blank?role_permissions.each do |rp|permission_value = @@permissions[rp.permission_key]entities = permission_value["entities"].map{|e| e.constantize}actions = permission_value["actions"].map{|e| e.to_sym}can actions, entitiesendendendenddef exec_role_rules(role)meth = :"rules_#{role.name.gsub(" ", "_")}"send(meth) if respond_to? methendend

经测试嘎嘎好用,就是我还需要添加一些条件筛选,导致我这个不能用,得删掉,有点可惜,记录一下~

这篇关于Ruby CanCanCan 动态定义方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/786838

相关文章

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,是一种网络协议,主要用于在IP网络中自动分配和管理IP地址以及其他网络配置参数。 2、作用 DHCP允许计算机和其他设备通

JavaWeb系列六: 动态WEB开发核心(Servlet) 上

韩老师学生 官网文档为什么会出现Servlet什么是ServletServlet在JavaWeb项目位置Servlet基本使用Servlet开发方式说明快速入门- 手动开发 servlet浏览器请求Servlet UML分析Servlet生命周期GET和POST请求分发处理通过继承HttpServlet开发ServletIDEA配置ServletServlet注意事项和细节 Servlet注

OSG学习:LOD、数据分页、动态调度

LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。在OSG的场景结点组织结构中,专门提供了场景结点osg::LOD来表达不同的细节层次模型。其中,osg::LOD结点作为父节点,每个子节点作为一个细节层次,设置不同的视域,在不同的视域下显示相应的子节点。 数据分页:在城市

Java代理-动态字节码生成代理的5种方式

上篇讲到了代理模式出现的原因,实现方式以及跟其他相似设计模式的区别。传送门@_@ http://blog.csdn.net/wonking666/article/details/79497547 1.静态代理的不足 设计模式里面的代理模式,代理类是需要手动去写的。但是手写代理的问题颇多 1.如果不同类型的目标对象需要执行同样一套代理的逻辑,比如说在方法调用前后打印参数和结果,那么仍然需要为每

Android插件化学习之路(一)之动态加载综述

前段时间,公司项目完成了插件化的开发,自己也因此学习了很多Android插件化的知识,于是想把这些内容记录下来,本次带来Android插件化的第一篇:动态加载综述 Android插件化学习之路(一)之动态加载综述 Android插件化学习之路(二)之ClassLoader完全解析 Android插件化学习之路(三)之调用外部.dex文件中的代码 Android插件化学习之路(四)之使用插件中的R

在WinCE的C#编程中,需要静态调用C++的动态库,需要添加using System.Runtime.InteropServices

using System.Runtime.InteropServices;         [DllImport("Win32DLL.dll", EntryPoint = "WriteREG_SZToRegTCHAR")]         private static extern bool WriteREG_SZToRegTCHAR(int iFlag, string regKeyP

C#界面动态布局 界面控件随着界面大小尺寸变化而变化

要想写一个漂亮的界面,光靠利用Anchor和Dock属性是远远不够的,我们需要用到相对布局,就是不管窗口大小怎么变化,控件相对父控件的相对位置保持不变。可惜c#里没有提供按照百分比布局。所以只能自己再resize()事件里调整控件位置。 首先在窗体的构造函数里保存父窗体的长宽,以及每个控件的X,Y坐标的相对位置:  int count = this.Controls.Count * 2 + 2;

[240623] ShellScript 视角下的 Ruby | Tiobe 2406 - C++ 超 C;Fortran 老当益壮

目录 @[TOC](目录)ShellScript 视角下的 Ruby引言Ruby 用于 Shell 脚本的优势结论 Tiobe 2406 - C++ 超 C;Fortran 老当益壮 ShellScript 视角下的 Ruby 引言 Ruby 常与 Rails 框架联系在一起,导致许多人忽略了它本身的强大。Ruby 是一门功能丰富且完整的语言,在编写 Shell 脚本方面甚至优于 P

VUE2 elementui 动态表单嵌套新增移除

VUE2 elementui 动态表单嵌套新增移除 代码 <template><div><el-button type="text" @click="dialogTableVisible = true">打开嵌套表格的 Dialog</el-button><el-dialog title="收货地址" :visible.sync="dialogTableVisible"><el-form r

动态规划DP--斐波那契数、爬楼梯、使用最小花费爬楼梯等示例代码

动态规划DP 文章目录 动态规划DP509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯62. 不同路径63. 不同路径II343.整数拆分 509. 斐波那契数 509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) =