通过CanCan授权Sinatra

时间:2013-10-26 12:48:13

标签: ruby sinatra authorization cancan

我正在尝试使用一些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

定义了两个模型,ProjectManager。它们存储在MongoDB中(通过mongoid,NO datamapper,ActiveRecord等)并且具有has_and_belongs_to_many关系,例如。可以通过project.managersmanager.projects访问这些关系。

现在,只有与特定项目有关系的经理才能编辑项目。我希望拥有的是authorize!上的类似内容:

class Ability
  include CanCan::Ability
  def initialize(user)
    can :edit, project if project.managers.include? user
  end
end

显然,这不起作用,因为Ability不知道任何project

有什么好办法吗?不一定是CanCan ......

1 个答案:

答案 0 :(得分:1)

试试这个

def initialize(user)
  can :edit, Project do |project|
    project.managers.include? user
  end
end