2012-02-21 8 views
7

Digamos que está escribiendo el software para Blogger.¿Cómo se trata de: crear un permiso en cancan definido por el objeto primario?

Cada usuario puede crear una publicación de blog solo si es el propietario del blog. CanCan normalmente definir una prueba de característica en esta circunstancia como:

user.can? :create, Post 

Sin embargo, el usuario sólo puede crear el cargo si son el propietario del blog actual y no hay manera de hacer referencia al blog actual usando sólo su nombre de clase. Lo que realmente necesita para ser capaz de hacer es:

user.can? :create, Post, @current_blog 

de tal manera que en las definiciones de cancán puedo decir

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

Es eso posible o estoy confundido en cómo me acerco a esto?

Respuesta

8

Definir una habilidad basado en el padre del objeto actual:

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

Esto se asegurará de que el usuario actual puede crear un nuevo registro del anuncio para un blog de la que son propietarios.

  • utiliza Post.blog_id para encontrar padres Blog registro
  • compara Blog.user_id campo para current_user.id campo

También asegúrese de que está utilizando una declaración :through durante la carga y la autorización de su recurso Post, por lo CanCan sabe quién el registro principal es

PostsController: 

load_and_authorize_resource :through => :blog 

Véase el CanCan wiki en GitHub para obtener más detalles.

+1

The: through =>: blog al final fue el trato. ¡Muchas gracias! – rfsbsb

0

Puede utilizar

user.can? : Create_posts, @current_blog

o

user.can: actualización, @current_blog

en lugar de

user.can? : crear, publicar, @current_blog

. Por supuesto, es probable que necesite sacar new y create acción de load_and_authorize_resource. Y la prueba de "autorización" por sí mismo

def nueva
no autorizada! si no puede? : Create_posts, @current_blog
final

+0

¿sabes cómo abordarías la definición de habilidad real? normalmente es de la forma 'can: create Post do | post_instance | ...' así que no está claro cómo el solo pasar diferentes variables podría funcionar con eso? –

+0

Para su ejemplo, yo usaría 'can (: create_posts, Blog) do | blog | usuario == blog.owner end'. Por lo tanto, la prueba se hace en @current_blog no en Post, sino en PostsController.new. – Foton

+0

No estoy seguro de que funcione, ya que creo que CanCan indexa los permisos según el tipo de objeto pasado, por lo que si se pasa en 'blog' se verían los permisos del blog. La forma en que lo solucioné al final es configurar un nuevo objeto: 'user.can? : create, @ current_blog.posts.new' - de esa manera puedo pasar un objeto de publicación y todavía leer el elemento principal –

Cuestiones relacionadas