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

accessible_byを試してください。この方法では、ユーザーがデータにアクセスできない場合に空のリストを表示するだけです。つまり、ページへのアクセスを制限する代わりに、cancan スコープを使用してデータへのアクセスを制限します。

参照:関連する回答

于 2012-10-23T09:34:43.907 に答える
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
于 2012-04-13T16:47:58.063 に答える