2013-08-20 13 views
8

Ho una casella di selezione multipla per un'associazione has_many. Le params entrare come:Autorizzazione di un array di ID con la gemma Pundit

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

Uso dei parametri forti, non mi permetto questo attributo perché vorrei autorizzare io stesso modo la gente non può semplicemente mettere quello che vogliono in esso.

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 

Questo approccio sta per costringermi a trovare tutti i Foos, ciclo attraverso di loro, e autorizzare singolarmente. C'è un modo più semplice per gestire l'autorizzazione has_many, preferibilmente con la gemma Pundit?

+2

Ciao Logan, sono uno dei manutentori di Pundit e vorrei conoscere il tuo caso d'uso. È semplicemente l'autorizzazione di tutti i record nella raccolta, o sono in qualche modo coinvolti controlli aggiuntivi? Il tuo contributo potrebbe risolvere la tua domanda in modo corretto in una versione futura e anche aiutare gli altri. Sarei felice se potessi lasciare un commento [qui] (https://github.com/elabs/pundit/issues/60). Grazie in anticipo! –

+3

Per salvare tutti dalla lettura dell'intero thread di discussione su Github. Questo problema è chiuso, fondamentalmente dicendo che può essere gestito estendendo Pundit o cambiando il modo in cui si va su questo. –

risposta

1

Il modo più semplice per eseguire questa operazione è il ciclo. Iterare attraverso ogni utente dalla matrice degli utenti e autorizzare ogni singolo utente. Per esempio,

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 

Quindi questo è il molto semplice e risposta più semplice.

0

Faccio qualcosa di simile a questo. A causa delle poche informazioni che hai fornito, farò una serie di ipotesi.

  1. Hai un'associazione da molti a molti di utenti agli utenti. Con questo voglio dire che un foo può avere molti utenti e un utente può essere un membro di molte persone.

  2. Si capisce come impostare i modelli da raggiungere (1). Se non si limita a commentare, modifico questa risposta.

Così che cosa avremo bisogno di avere a lavorare per questo al lavoro è il seguente:

  1. @foo.users restituisce un insieme di utenti
  2. @user.foos restituisce un insieme di Foos

Con i modelli impostati per supportare le azioni sopra questo è molto più facile di quello che stai facendo per essere.

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

Penso che manchi il punto di pundit. Pundit ti permette di fare l'autorizzazione per un utente per utente. Quindi il codice sopra scopre un utente solo ai gruppi (foos in questo caso) di cui fanno parte.

Problemi correlati