本文主要是介绍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 动态定义方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!