0

我正在尝试使用 CanCan 满足以下要求:

  1. 如果一个交易被分配给 1-many 网络,如果他/她是任何分配网络的成员,则用户可以阅读该交易。

  2. 如果交易未分配给任何网络,则任何注册用户都可以查看该交易,无论其网络成员身份如何。

  3. 如果交易未分配给网络,但交易标记为 member_only = true,则用户可以在他/她是任何网络的成员时阅读该交易。

  4. 如果交易未分配给网络并且标记为 member_only = false,则任何注册用户都可以阅读该交易。

  5. 客人(即非用户)无法阅读任何优惠

我想我有 2-4 个涵盖以下内容:

if current_user.persisted?
  can :read, Deal, current_user.networks.empty? ? { member_only: false } : {}
end

但是,我不确定如何进一步限制分配给网络的交易。CanCan 有可能吗?如果是这样,建议如何?谢谢。

4

2 回答 2

1

尝试access_by。这样,如果用户无权访问数据,您只会显示一个空列表。换句话说,不是限制对页面的访问,而是使用 cancan 范围限制对数据的访问。

另见:相关答案

于 2012-10-23T09:34:43.907 回答
0

Here is what I came up with. Probably not the best solution, so feedback welcomed.

if current_user.persisted?
  can :read, Deal, { id: DealAccessPolicy.accessible_deal_ids_for(current_user) }
end

class DealAccessPolicy
  def self.accessible_deal_ids_for(user)
    Deal.pluck(:id) - (Network.all - user.networks).map{|r| r.deals.map(&:id)}.flatten.uniq
  end
end
于 2012-04-13T16:47:58.063 回答