2013-08-20 24 views
8

Mam wiele pól wyboru dla skojarzenia has_many. Params przyjść jak:Autoryzacja tablicy identyfikatorów z klejnotem Pundit

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

Używanie silnych parametry, nie pozwalają tego atrybutu, ponieważ chciałbym, aby je autoryzować się więc ludzie nie mogą po prostu umieścić, co chcą w nim.

def update 
    bar.foos = authorized_foos 
    bar.update(baz_params) 
    respond_with bar 
end 

private 

    def authorized_foos 
    foos = Foo.find(params[:baz][:foo_ids]) 
    foos.each do |foo| 
     authorize foo, :manage? 
    end 
    end 

Takie podejście zmusi mnie do znalezienia wszystkich foo, przejrzenia ich i autoryzowania każdego z nich osobno. Czy istnieje łatwiejszy sposób zarządzania has_many autoryzacją, najlepiej z klejnotem Pundit?

+2

Witam Logana, jestem jednym z opiekunów Pundit i chciałbym dowiedzieć się o Twoim przypadku użycia. Czy to po prostu autoryzowanie wszystkich rekordów w zbiorze, czy też w jakiś sposób są to dodatkowe kontrole? Twoje dane wejściowe mogą sprawić, że Twoje pytanie będzie dobrze rozwiązane w przyszłej wersji, a także pomóc innym. Byłbym szczęśliwy, gdyby można było zostawić komentarz [tutaj] (https://github.com/elabs/pundit/issues/60). Z góry dziękuję! –

+3

Aby uratować wszystkich przed przeczytaniem całego wątku na Github. Ten problem jest zamknięty, mówiąc w zasadzie, że można go obsłużyć, rozszerzając Pundit lub zmieniając sposób, w jaki to robisz. –

Odpowiedz

1

Najprostszy sposób to zrobić w pętli. Iteruj przez każdego użytkownika z tablicy użytkowników i autoryzuj każdego użytkownika. Na przykład

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 

Więc to jest bardzo proste i najprostsza odpowiedź.

0

Robię coś podobnego do tego. Z powodu tego, jak mało informacji podałeś, zamierzam zrobić zestaw założeń.

  1. Masz wiele do wielu stowarzyszeń użytkowników do użytkowników. Rozumiem przez to, że foo może mieć wielu użytkowników, a użytkownik może być członkiem wielu serwisów.

  2. Rozumiesz, jak skonfigurować modele do osiągnięcia (1). Jeśli nie chcesz komentować, zmienię tę odpowiedź.

Więc co musimy mieć pracę dla tej pracy jest następująca:

  1. @foo.users zwraca kolekcję użytkowników
  2. @user.foos powraca zbiór Foo

Dzięki modelom skonfigurowanym do obsługi powyższych działań jest to znacznie łatwiejsze niż się wydaje.

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

Wydaje mi się, że brakuje wam sensu pseudonimu. Pundit pozwala na autoryzację użytkownika na podstawie użytkownika. Tak więc powyższy kod ogranicza użytkownika tylko do grup (w tym przypadku foo), że są one częścią.