Jak serializować uprawnienia przy pomocy aktywnych_modeli_serializatorów? Nie mam dostępu do metody current_user
lub can?
w modelach i serializerach.Uprawnienia do szeregowania (np. CanCan) z aktywnymi_modelami_serializatorami
Odpowiedz
Po pierwsze, aby uzyskać dostęp do current_user
w kontekście serializer, korzystać z nowej funkcji zakres:
class ApplicationController < ActionController::Base
...
serialization_scope :current_user
end
W przypadku, gdy instancji serializers ręcznie, należy przekazać zakres:
model.active_model_serializer.new(model, scope: serialization_scope)
Następnie wewnątrz serializera dodaj niestandardowe metody, aby dodać własne pseudo-atrybuty autoryzacji, używając scope
(bieżący użytkownik) w celu określenia uprawnień.
Jeśli używasz kankana, można zainicjować klasę możliwość dostępu do metody can?
:
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
stworzyliśmy klejnot, który zapewnia tę funkcję: https://github.com/GroupTalent/active_model_serializers-cancan
myślę, że można przekazać cokolwiek chcesz serialization_scope
, więc po prostu przekazuję umiejętność.
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
Nie mogę zrobić inaczej, ponieważ moje umiejętności są oparte na dwóch zmiennych (nie w powyższym przykładzie).
Jeśli nadal potrzebujesz dostępu do current_user, możesz po prostu ustawić zmienną instancji na umiejętność.
Nie rozumiem - czy od razu odpowiedziałeś na własne pytanie? –
Tak, zrobiłem - zobacz [ten artykuł] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). Chciałem, aby ta wiedza została zachowana, ale uznałem, że jest zbyt trywialna/wyspecjalizowana, aby publikować na moim blogu, więc napisałem ją tutaj, w stylu pytań i odpowiedzi. –
@JoLiss Jako alternatywę dla stylu "super.merge" możesz powiedzieć 'attributes: can_update,: can_delete', a następnie zdefiniować can_update i can_delete jako metody w serializatorze. Albo działa. – tee