¿Cómo serializo los permisos con active_model_serializers? No tengo acceso a current_user
o al método can?
en modelos y serializadores.Permisos de serialización (por ejemplo, CanCan) con active_model_serializers
Respuesta
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
Hemos creado una joya que ofrece esta funcionalidad: https://github.com/GroupTalent/active_model_serializers-cancan
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.
- 1. CanCan - Acceso denegado - Forma de hacer CanCan Especifique en el LOG ¿Por qué?
- 2. Autorización de administración con CanCan
- 3. Autorización de contexto con el uso de CanCan
- 4. ¿Cómo hacer la paginación con cancan?
- 5. atributos de fecha de serialización
- 6. Autorización de rieles con CanCan Problema
- 7. Cancan accessible_by
- 8. ¿Cómo hacer pruebas de integración con RSpec y Devise/CanCan?
- 9. acceso CanCan `puede` método de un modelo
- 10. Rspec, CanCan e idear
- 11. ¿Por qué utilizar la serialización
- 12. serialización Python - ¿Por qué pickle?
- 13. CanCan y controladores sin modelos
- 14. Permisos por directorio en git
- 15. Diseñar/Cancan/Rolify juntos
- 16. Las acciones personalizadas de CanCan no funcionan con los bloques
- 17. ¿Por qué usamos la serialización?
- 18. Error de CanCan 'rol de método no definido?' Diseñar con
- 19. ¿Por qué se produce este error de permisos con mod_passenger.so?
- 20. Mongoid y CanCan
- 21. carriles - Parámetros con "punto" (por ejemplo /google.com)
- 22. Adición de permisos por objeto django administrador
- 23. cancan skip_authorization_check para autenticación Devise
- 24. serialización de Java con inicialización estática
- 25. serialización personalizada con DataContractSerializer
- 26. Serialización con Qt
- 27. enumeraciones Serialización con Jackson
- 28. vistas de pruebas que utilizan CanCan y diseñar con RSpec
- 29. ¿Cómo integrar CanCan con múltiples modelos de diseño?
- 30. serialización JSON de matriz con objetos polimórficos
No entiendo - ¿respondiste tu propia pregunta de inmediato? –
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. –
@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