我正在尝试使用一些auth机制为我的webapp工作(用Sinatra编写)。目前我正在玩sinatra-can,看起来很棒。我现在面临的问题是我需要从can方法访问特定模型。假设我有一条看起来像这样的路线:
class ProjMgmt < Sinatra::Base
get '/edit/:project' do
project = Project.where(name: param[:project]).first
authorize! :edit, project
project.to_html
end
end
定义了两个模型,Project
和Manager
。它们存储在MongoDB中(通过mongoid,NO datamapper,ActiveRecord等)并且具有has_and_belongs_to_many
关系,例如。可以通过project.managers
或manager.projects
访问这些关系。
现在,只有与特定项目有关系的经理才能编辑项目。我希望拥有的是authorize!
上的类似内容:
class Ability
include CanCan::Ability
def initialize(user)
can :edit, project if project.managers.include? user
end
end
显然,这不起作用,因为Ability
不知道任何project
。
有什么好办法吗?不一定是CanCan ......
答案 0 :(得分:1)
试试这个
def initialize(user)
can :edit, Project do |project|
project.managers.include? user
end
end