基于 cancancan 行的过滤器

cancancan row based filter

我已经在 cancancan 中声明了一个角色技能 gem (rails 5, postgres, devise):

can [:update, :show, :destroy, :index], SalesDatum do |datum|
  datum.try(:user_id) == user.id #the ids just access the id's from the user object that is passed into can can and from the table
end

SalesDatum 有一个 user_id 字段。

这适用于显示操作,因为我只能 show 已登录的 SalesDatum user_id 例如:

http://localhost:8080/projects/19/sales_data/961 正确获得身份验证,因为登录 user_id 与 sales_data

上的 user_id 匹配

http://localhost:8080/projects/19/sales_data/800 正确地没有得到验证,因为登录的 user_id 与 sales_data

上的 user_id 不匹配

但是,当我执行获取索引操作时: http://localhost:8080/projects/19/sales_data 它显示了 @sales_data 变量的所有销售数据。因此,它会显示 data.id 800 和 961。

销售数据控制者:

load_and_authorize_resource
def index
  @sales_data = SalesDatum.where(project_id:params[:project_id])
end

如何让索引操作只显示具有相关 user_id 的数据? cancan 不应该根据 user_id 过滤吗?

您需要使用哈希语法定义规则。

can [:update, :show, :destroy, :index], SalesDatum, user_id: user.id

您可能还想定义 edit 操作,因此:

can [:edit, :update, :show, :destroy, :index], SalesDatum, user_id: user.id

可以简化为:

can :manage, SalesDatum, user_id: user.id

如果 SalesDatum 定义了 belongs_to :user,您还可以写:

can :manage, SalesDatum, user: user