我正在尝试使用CanCan来满足以下要求:
如果将交易分配给1-many网络,则用户可以在他/她是任何已分配网络的成员时阅读该交易。
如果没有为任何网络分配交易,任何注册用户都可以查看该交易,无论其网络成员身份如何。
如果交易未分配给网络,但交易被标记为member_only = true,则用户可以阅读该交易,如果他/她是任何网络的成员。 < / p>
如果交易未分配给网络且标记为member_only = false,则任何注册用户都可以阅读该交易。
访客(即非用户)无法阅读任何优惠
我认为我有2-4个以下内容:
if current_user.persisted?
can :read, Deal, current_user.networks.empty? ? { member_only: false } : {}
end
但是,我不确定如何进一步限制分配给网络的交易。这可能与CanCan有关。如果是这样,建议如何?谢谢。
答案 0 :(得分:1)
试试accessible_by。 这样,如果用户无权访问数据,您只需显示一个空列表。 换句话说,您可以使用cancan范围限制对数据的访问,而不是限制对页面的访问。
答案 1 :(得分:0)
这是我想出的。可能不是最好的解决方案,所以反馈表示欢迎。
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