Ruby on rails 在宝石中使用CanCan
我不确定这是否可行,但我想在我自己的宝石中使用CanCan。我尝试了以下代码:Ruby on rails 在宝石中使用CanCan,ruby-on-rails,ruby-on-rails-3,gem,cancan,Ruby On Rails,Ruby On Rails 3,Gem,Cancan,我不确定这是否可行,但我想在我自己的宝石中使用CanCan。我尝试了以下代码: module DynamicMenu require 'engine' if defined?(Rails) require 'cancan' module MenuItems #The new dynamic_menu encapsulates class DynamicMenu def initialize @actionMenuItems ||= []
module DynamicMenu
require 'engine' if defined?(Rails)
require 'cancan'
module MenuItems
#The new dynamic_menu encapsulates
class DynamicMenu
def initialize
@actionMenuItems ||= []
end
def newmenuitem(name,link,method=:get,confirm="Are you sure?")
genlink = ""
if method==:delete
genlink += "<a href=\"#{link}\" data-confirm=\"#{confirm}\" data-method=\"delete\" rel=\"nofollow\">
#{name}</a>".html_safe
elsif link==:submit
genlink += "<a href=\"#\" data-submit=\"true\">#{name}</a>".html_safe
elsif link == :back
genlink = "<a href=\"#\" data-back=\"true\">#{name}</a>".html_safe
else
genlink = "<a href=\"#{link}\">#{name}</a>".html_safe
end
@actionMenuItems << genlink.html_safe
end
def newCanCanProtectedItem(name,link,method=:get,confirm="Are you sure?")
actions = Rails.application.routes.recognize_path(link)
if defined?(CanCan) and can? actions[:action],actions[:controller].singularize.capitalize
newmenuitem(name,link,method,confirm)
else
@actionMenuItems << "CANCAN NOT DEFINED OR ABILITY.RB PROBLEM";
end
end
def getItems
return @actionMenuItems
end
end
end
end
模块动态菜单
如果已定义,则需要“引擎”(Rails)
需要“cancan”
模块菜单项
#新的动态菜单封装了
类动态菜单
def初始化
@actionMenuItems | |=[]
结束
def newmenuitem(名称、链接、方法=:get、confirm=“确定吗?”)
genlink=“”
如果方法==:删除
genlink+=“”.html\u安全
elsif链接==:提交
genlink+=“”.html\u安全
elsif链接==:返回
genlink=“.html\u安全
其他的
genlink=“.html\u安全
结束
@actionMenuItemsCanCan需要依赖一个能力类。所以,不知何故,你需要包括一个能力类。基本情况如下所示:
class Ability
include CanCan::Ability
def initialize(user)
end
end
我使用了一个假设,但这可能是一个初始值设定项或其他东西,这个类被称为ability
在gem中使用CanCan时,您必须创建一个新的能力类实例,或者将其传入。我做到了:
ability = Ability.new(current_user) #You have to pass in a user
必须传入一个用户。然而,当前用户似乎不在gem的范围内定义。因此,我也向我的方法中传递了一个用户
在那之后,我能够做到:
ability.can? actions[:action],actions[:controller].singularize.capitalize