¿Cómo autorizo ​​esto con CanCan?

Tengo un método que se parece al siguiente en mi controlador:

 def some_request
    user = User.find(params[:friend_user_id])
    req = user.requests.build(:from_id => current_user.id)
    # do more stuff!
 end

Ahora esto está en un controlador llamado RandomController por el bien de los argumentos. Este es un controlador RESTful con métodos no RESTful como se muestra a continuación. Solo estoy usando authorize_resource y sin carga de recursos. Pensé que podría manejar esto haciendo lo siguiente en mi clase de Habilidad:

  class Ability
  include CanCan::Ability

  def initialize(user)
    if user
      can :manage, Request do |req|
        req.user_id == user.id
      end
    end
  end

Esto no lo está haciendo. ¿Cómo modifico some_request para autorizar la creación de una solicitud? Básicamente, quiero hacer lo siguiente: Permitir que cualquier usuario autenticado realice todas las operaciones CRUD (: administrar) en una Solicitud que les pertenece a ellos y solo a ellos. El usuario tiene una relación de has_many con Solicitud como en:

has_many :requests

pensamientos?

preguntado el 27 de agosto de 11 a las 23:08

1 Respuestas

Un par de cosas:

  1. estas llamando req.user.id, que puede no estar cargando el recurso del usuario (¡y probablemente tampoco debería hacerlo!). Cambia eso a req.user_id y ahórrese la solicitud del recurso de usuario.
  2. CanCan requiere que uses el current_user objeto, no solo user.

Ryan Bates ha hecho un trabajo fantástico al documentar las características y capacidades de CanCan. Eche un vistazo al RailsCast # 192 episodio (O la versión de texto sin formato ASCII-cast) y el Proyecto GitHub para más información.

Respondido 28 ago 11, 05:08

El punto 1 tiene sentido. 2 no lo hace. En mi clase Ability, el método initialize se ve así: def initialize (usuario), y eso es esencialmente current_user. Esto realmente no responde a la pregunta original. - randombits

@randombits, Chris no puede ver el resto de tu clase de Habilidad, así que en el contexto de lo que es visible, su segundo punto tiene sentido. - pellizcado

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.