1

我的权限在CanCan wiki上描述的数据库中定义。我想:index只为我的权限表中的 id 授权,但如果没有资源被授权,仍然显示索引页面。

如果我使用load_and_authorize_resource,它会根据权限加载资源。如果我没有,index则无法访问该操作。我在资源上被拒绝访问。

如果我仍然想允许在:index没有授权资源的情况下访问操作,我会看到两个选项:

选项 1(讨厌它) :手动加载索引的资源。

class FirmsController < ApplicationController
  load_and_authorize_resource :except => :index

  def index
    @firms = user.permissions.where{action: ["index", "manage", "read"], subject_class: "Firm"}
  end
end

选项 2(meh):为 :index 添加一个具有 id: [] (无)约束的功能,然后用我的数据库权限覆盖它。

class Ability
  include CanCan::Ability

  def initialize(user)

    user ||= User.new # guest user (not logged in)

    can :create, Firm
    can :index, Firm, id: []

    user.permissions.each do |permission|
      if permission.subject_id.nil?
        can permission.action.to_sym, permission.subject_class.constantize
      else
        can permission.action.to_sym, permission.subject_class.constantize, :id => permission.subject_id
      end
    end

  end
end

选项 3?

你能想出一个更清洁的解决方案吗?

4

1 回答 1

1

文档中所述,您应该使用辅助方法:

  skip_authorize_resource :only => :index
于 2012-04-11T21:00:39.527 回答