2

我的能力文件有

if user.has_role? :admin
  can :manage, :all
else
  can :manage, Company, :id => Company.with_role(:operator, user).pluck(:id)
  ...
end

我的公司控制人索引有

def index
@companies = Company.with_role(:operator, current_user)

但是,当我以经营公司的用户身份登录时,我无法访问该页面。(即使 Company.with_role(:operator, user) 在控制台中返回一个关系!)

公司有代码。我不知道如何在康康语中写这个:

Company.with_role(:operator, user).map{|o| o.codes}

但是 wiki 说如果我使用块然后 authorize_resource 将不会设置实例变量@codes,因为它不知道哪些对象属于用户。所以我不能使用:

can :manage, Code =>  do |Code|
    user.has_role? :operator, code.company
end

我正在寻找可以让我的 CodesController 执行以下操作的解决方案:

def index
if params[:company_id]
  @keywords = Code.where(:company_id => params[:company_id])
end

operator并以其他方式向用户显示他们拥有角色的所有公司的所有代码。

4

2 回答 2

0
def index
    if params[:company_id]
      @codes = Company.with_role(:operator, current_user).where(:id => params[:company_id]).map{|o| o.keywords}.flatten
    else
      @codes = Company.with_role(:operator, current_user).map{|operator| operator.keywords}.flatten
    end
  end
于 2014-02-11T19:43:07.317 回答
0

怎么样:

can :manage, Company do |company|
    user.has_role? :operator, company
end
can :manage, Code do |code|
    user.has_role? :operator, code.company
end

如果您没有对 can 定义使用块语法,则可以在 CodesController 中使用 load_and_authorize_resource 将索引过滤为仅当前用户可访问的索引。

更新 因为这使用了块语法 CanCan 不能使用 load_resource 确定要加载哪些对象(因为它想使用 SQL 语法)。如果您可以将其重写为不使用块语法,那么您会很好。如果您必须使用角色类型逻辑,您可以在控制器的 index 方法中添加类似于以下的代码:

@codes = Code.all.select {|code| can?(:manage, code)}

或者如果您想绕过这种情况下的能力以提高效率

@codes = Company.with_role(:operator, @current_user).codes
于 2014-02-11T01:10:25.723 回答