Respuesta

22

En primer lugar, para obtener acceso a la current_user en el contexto serializador, utilizar la nueva característica alcance:

class ApplicationController < ActionController::Base 
    ... 
    serialization_scope :current_user 
end 

Si estás instanciar serializadores manualmente, asegúrese de pasar el ámbito de aplicación:

model.active_model_serializer.new(model, scope: serialization_scope) 

Luego, dentro del serializador, agregue métodos personalizados para agregar sus propios pseudoatributos de autorización, usando scope (el usuario actual) para determinar los permisos.

Si está utilizando CanCan, se puede crear una instancia de la clase de capacidad de acceder al can? método:

attributes :can_update, :can_delete 

def can_update 
    # `scope` is current_user 
    Ability.new(scope).can?(:update, object) 
end 

def can_delete 
    Ability.new(scope).can?(:delete, object) 
end 
+0

No entiendo - ¿respondiste tu propia pregunta de inmediato? –

+2

Sí, lo hice - vea [este artículo] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). Quería preservar este conocimiento, pero me pareció demasiado trivial/especializado para publicarlo en mi blog, así que lo publiqué aquí, estilo de preguntas y respuestas. –

+1

@JoLiss Como alternativa al estilo "super.merge", puede decir 'attributes: can_update,: can_delete' y luego definir can_update y can_delete como métodos en el serializador. Cualquiera de los dos funciona, sin embargo. – tee

2

Creo que puede pasar cualquier cosa quiero serialization_scope así que simplemente apruebo la habilidad.

class ApplicationController < ActionController::Base 
... 
serialization_scope :current_ability 

def current_ability 
    @current_ability ||= Ability.new(current_user) 
end 

end 


class CommentSerializer < ActiveModel::Serializer 
    attributes :id, :content, :created_at, :can_update 

    def can_update 
    scope.can?(:update, object) 
    end 

end 

No puedo hacer otra cosa ya que mis habilidades se basan realmente en dos variables (no en el ejemplo anterior).
Si aún necesita acceso a current_user, simplemente puede establecer una variable de instancia en Ability.

Cuestiones relacionadas