cevap

22

Birincisi, yeni kapsam özelliği kullanmak, sıralandırıcı bağlamında current_user erişmek için:

model.active_model_serializer.new(model, scope: serialization_scope) 
: kapsamını geçmek

el serializers başlatmasını olan durumda
class ApplicationController < ActionController::Base 
    ... 
    serialization_scope :current_user 
end 

, emin olmak

Ardından, serializer içinde, izinleri belirlemek için scope (geçerli kullanıcı) kullanarak kendi yetkilendirme sözde özniteliklerinizi eklemek için özel yöntemler ekleyin.

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

Anlamıyorum - kendi sorunuzu hemen cevapladınız mı? –

+2

Evet, yaptım - [bu makale] konusuna bakın (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). Bu bilginin korunmasını istedim, ancak blogumda yayınlamak için çok önemsiz/uzman bulduğum için, burayı buraya yazdım, Soru & Cevap stili. –

+1

@JoLiss "super.merge" stiline alternatif olarak, "can_update,: can_delete" öznitelikleri diyebilir ve sonra can_update ve can_delete'yi serializer'daki yöntemler olarak tanımlayabilirsiniz. Ya işe yarıyor. – tee

2

Ben bir şey geçebilir düşünüyorum serialization_scope'u istiyorum, böylece Yeteneği geçiyorum.

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 

Yeteneklerim aslında iki değişkene (yukarıdaki örnekte değil) dayalı olduğu için bunu yapamam.
Eğer hala current_user öğesine erişmeye ihtiyacınız varsa, Yeteneğe bir örnek değişkeni ayarlayabilirsiniz.

İlgili konular