2012-08-01 22 views
6

Comencé una aplicación Rails con Devise y CanCan. Tengo usuarios que tienen una relación uno a muchos con los artículos. Soy nuevo en CanCan, esto es lo que estoy planeando hacer:CanCan - Cómo permitir que los usuarios actualicen y eliminen solo sus propios objetos

administración

  • puede hacer cualquier acción sobre los artículos

usuario conectado

  • puede leer y crear artículos
  • puede editar y destruir sus propios artículos

usuario invitado

  • puede leer artículos

pero estoy teniendo problemas para entender la sintaxis de CanCan. Entiendo que sería algo como esto.

def initialize(user) 
    user ||= User.new 
    if user.admin? 
    can :manage, Article 
    else 
    can :read, Article 
    end 
end 

Pero esto es sólo para el administrador y el invitado de usuario, no estoy seguro de cómo diferenciar un usuario invitado de un usuario conectado, ya que crea un nuevo objeto de usuario cuando el usuario está vacía. He visto que el código debería ser algo así como can [:edit, :destroy], Article, :user_id => user.id, pero no estoy seguro de cómo encajaría esto en el método de inicialización.

Y una última pregunta, si solo defino un can :read, Article en invitados, ¿bloquearía las otras acciones como crear y actualizar, como el listado en blanco de la acción de lectura?

Cualquier ayuda sería apreciada. ¡Muchas gracias!

Respuesta

15

Aquí es lo que hice:

En ability.rb

def initialize(user) 
    if user.nil? 
    can :read, Article 
    elsif user.admin? 
    can :manage, Article 
    else 
    can [:read, :create], Article 
    can [:update, :destroy], Article, :user_id => user.id 
    end 
end 

Y para la visualización de los enlaces, he utilizado esto:

- if can? :read, Article 
    = link_to 'Show', article 
- if can? :create, Article 
    = link_to 'New Article', new_article_path 
- if can? :update, article 
    = link_to 'Edit', edit_article_path(article) 
- if can? :destroy, article 
    = link_to 'Destroy', article, method: :delete, data: { confirm: 'Are you sure?' } 

y parece estar trabajando ahora , no estoy seguro de si esa es la mejor manera.

+0

La vista no se ve bien, pero no está relacionada con el tema de la pregunta, que parece estar bien cubierto en su capacidad.rb. –

+0

Estoy usando ayudantes hechos por mí mismo, como link_to_edit, link_to_destroy, etc. Mis ayudantes incluyen call to can?(), Por lo que no es necesario poner la lógica dentro de las vistas. –

8

Puede pasar de hash de condiciones:

can :manage, Article, :user_id => user.id 

Mira https://github.com/ryanb/cancan/wiki/defining-abilities para más detalles.

+0

He añadido este comentario la misma vez @mumble pregunta editada, y por ahora la pregunta incluye respuesta. –

Cuestiones relacionadas