2012-02-21 7 views
7

Diciamo che stai scrivendo il software per Blogger.Come si fa a: creare un'autorizzazione in cancan definita dall'oggetto padre?

Ogni utente può creare un post di blog solo se è il proprietario del blog. CanCan normalmente definire un controllo di capacità in questa circostanza come:

user.can? :create, Post 

Tuttavia l'utente può creare solo il post, se sono il proprietario del blog attuale e non c'è modo per fare riferimento al blog corrente utilizzando solo il suo nome di classe. Quello che ho davvero bisogno di essere in grado di fare è:

user.can? :create, Post, @current_blog 

tale che nelle definizioni cancan posso dire

can :create, Post do |post, blog| 
    user == blog.owner 
end 

È quello possibile o sono io confuso nel modo in cui mi sto avvicinando questo?

risposta

8

Definire la capacità sulla base del genitore dell'oggetto corrente:

can :create, Post, :blog => { :user => user } 

Questo farà in modo che l'utente corrente può solo creare un nuovo record post per un blog di cui sono proprietari.

  • utilizza Post.blog_id per trovare genitore Blog record di
  • confronta Blog.user_id campo per current_user.id campo

assicurarsi che si sta utilizzando una dichiarazione :through durante il caricamento e che autorizza la vostra risorsa Post, in modo CanCan sa anche che il record genitore è.

PostsController: 

load_and_authorize_resource :through => :blog 

Vedere lo CanCan wiki su GitHub per ulteriori dettagli.

+1

The: through =>: il blog alla fine era l'accordo. Grazie mille! – rfsbsb

0

È possibile utilizzare

user.can? : Create_posts, @current_blog

o

user.can: aggiornamento, @current_blog

anziché

user.can? : create, Post, @current_blog

. Ovviamente, è necessario eseguire l'azione new e create da load_and_authorize_resource. E test "autorizzazione" da soli

def nuovo
non autorizzata! se non è possibile? : Create_posts, @current_blog
fine

+0

sai come gestire la definizione dell'abilità effettiva? è normalmente nella forma 'can: create Post do | post_instance | ...' quindi non è chiaro come il solo passaggio di variabili diverse possa funzionare con quello? –

+0

Per il tuo esempio vorrei usare 'can (: create_posts, Blog) do | blog | utente == blog.owner end'. Quindi il test è effettuato su @current_blog non su Post, ma su PostsController.new. – Foton

+0

Non sono sicuro che funzionerebbe come credo che CanCan indicizzi le autorizzazioni in base al tipo di oggetto passato, quindi se si passasse in 'blog' si guarderebbero le autorizzazioni del blog. Il modo in cui mi sono aggirato alla fine è di impostare un nuovo oggetto: 'user.can? : create, @ current_blog.posts.new' - in questo modo posso passare in un oggetto post e leggere ancora il genitore al di fuori di esso –

Problemi correlati