2012-04-13 6 views
0

Ich versuche, die folgenden Anforderungen mit CanCan zu erfüllen:Wie kann ich Datensätze in CanCan basierend auf einer Assoziationswahrheit begrenzen?

  1. Wenn ein Deal zugeordnet ist 1-viele Netzwerke, kann der Benutzer die Transaktion lesen, wenn er/sie ein Mitglied einer der zugeordneten Netze .

  2. Wenn ein Geschäft keinem Netzwerk zugewiesen ist, kann es von jedem registrierten Benutzer unabhängig von seiner Netzwerkzugehörigkeit angezeigt werden.

  3. Wenn ein Deal keinem Netzwerk zugewiesen ist, der Deal jedoch als member_only = true markiert ist, kann der Benutzer den Deal lesen, wenn er Mitglied eines Netzwerks ist.

  4. Wenn ein Geschäft nicht zu einem Netzwerk und markiert member_only = false zugeordnet ist, jeder registrierte Benutzer kann den Deal lesen.

  5. Gäste (dh kein Benutzer)

  6. alle möglichen Angebote nicht lesen kann

Ich glaube, ich habe 2-4 mit dem abgedeckte folgend:

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

Aber ich bin nicht sicher, wie um Geschäfte, die einem Netzwerk zugewiesen sind, weiter einzuschränken. Ist das mit CanCan möglich? Wenn ja, Vorschläge wie? Vielen Dank.

Antwort

0

Hier ist, was ich gefunden habe. Wahrscheinlich nicht die beste Lösung, also Feedback begrüßt.

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 
1

Versuchen Sie accessible_by. Auf diese Weise zeigen Sie nur eine leere Liste, wenn der Benutzer keinen Zugriff auf Daten hat. Mit anderen Worten, anstatt den Zugriff auf Seiten zu beschränken, schränken Sie den Zugriff auf Daten mithilfe von cancan scopes ein.

Siehe auch: related answer

Verwandte Themen