Odpowiedz

22

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 
+0

Nie rozumiem - czy od razu odpowiedziałeś na własne pytanie? –

+2

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. –

+1

@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

2

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ść.