2013-08-20 5 views
8

Ich habe eine Mehrfachauswahlbox für eine has_many-Zuordnung. Die params kommt als:Autorisieren eines Arrays von IDs mit dem Pundit-Juwel

foo_ids: ["1", "2", "3"] 

starke Parameter verwenden, ich nicht zulassen dieses Attribut, weil ich es selbst autorisieren möchte, damit die Menschen nicht nur in sich, was sie wollen.

Dieser Ansatz wird mich zwingen, alle Foos zu finden, sie durchzuschleifen und jede einzeln zu autorisieren. Gibt es eine einfachere Möglichkeit, has_many-Berechtigungen zu verwalten, vorzugsweise mit dem Pundit-Juwel?

+2

Hallo Logan, ich bin einer der Betreuer von Pundit und würde gerne über Ihren Anwendungsfall erfahren. Genehmigt es einfach alle Datensätze in der Sammlung oder sind zusätzliche Prüfungen irgendwie involviert? Ihre Eingabe könnte Ihre Frage in einer zukünftigen Version gut lösen und auch anderen helfen. Ich würde mich freuen, wenn Sie hier einen Kommentar hinterlassen könnten (https://github.com/elabs/pundit/issues/60). Danke im Voraus! –

+3

Um jeden vor dem Lesen der gesamten Ausgabe Thread auf Github zu speichern. Dieses Thema dort ist geschlossen, im Grunde gesagt, es kann gehandhabt werden, indem man Pandit erweitert oder die Art und Weise verändert, wie man das macht. –

Antwort

1

Die einfachste Möglichkeit ist das Schleifen. Iterieren Sie jeden Benutzer aus dem Array des Benutzers und autorisieren Sie jeden einzelnen Benutzer. Zum Beispiel

users_id_array = [1,2,3,4,5,6] 

private 

    def authorized_users 
    users = User.find(params[:group][:user_ids]) 
    users.each { |u| authorize u, :manage? } 
    ... 
end 

Das ist also die sehr einfach und einfachste Antwort.

0

Ich mache etwas ähnliches. Aufgrund der wenigen Informationen, die Sie zur Verfügung gestellt haben, werde ich eine Reihe von Annahmen treffen.

  1. Sie haben eine viele zu viele Assoziation von Foos zu Benutzern. Damit meine ich, dass ein Foo viele Benutzer haben kann und ein Benutzer Mitglied vieler Foos sein kann.

  2. Sie verstehen, wie Sie die Modelle einrichten, um (1) zu erreichen. Wenn Sie nicht nur kommentieren und ich werde diese Antwort bearbeiten.

Also, was wir für diese Arbeit haben müssen arbeiten, ist die folgende:

  1. @foo.users gibt eine Sammlung von Benutzern
  2. @user.foos gibt eine Sammlung von foos

Mit den Modellen, die zur Unterstützung der obigen Aktionen eingerichtet wurden, ist dies viel einfacher, als Sie es sich vorstellen können.

class FooPolicy < ApplicationPolicy 
    class Scope < Scope 
    def resolve 
     user.foos 
    end 
    end 
end 

Ich denke, dass Sie den Punkt des Pandits vermissen. Mit Pundit können Sie Benutzer für Benutzer autorisieren. Der obige Code definiert also einen Benutzer nur für die Gruppen (in diesem Fall foos), zu denen sie gehören.

Verwandte Themen