8

के साथ अनुमतियों को क्रमबद्ध करें (उदा। कैनकन) सक्रिय_model_serializers के साथ अनुमतियों को क्रमबद्ध कैसे करें? मेरे पास current_user या can? मॉडल और सीरियलाइज़र में विधि तक पहुंच नहीं है।सक्रिय_model_serializers

उत्तर

22

पहले, serializer संदर्भ में current_user तक पहुँच प्राप्त करने के लिए, का उपयोग नई गुंजाइश सुविधा:

model.active_model_serializer.new(model, scope: serialization_scope) 
: गुंजाइश पारित करने के लिए

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

मामले आप मैन्युअल रूप से serializers instantiating कर रहे हैं, सुनिश्चित हो

फिर धारावाहिक के अंदर, अनुमतियों को निर्धारित करने के लिए scope (वर्तमान उपयोगकर्ता) का उपयोग करके, अपने स्वयं के प्रमाणीकरण छद्म-विशेषताओं को जोड़ने के लिए कस्टम विधियां जोड़ें।

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

मुझे समझ में नहीं आया - क्या आपने तुरंत अपने प्रश्न का उत्तर दिया? –

+2

हां, मैंने किया - यह आलेख देखें (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/)। मैं चाहता था कि ज्ञान का यह टुकड़ा संरक्षित हो, लेकिन मुझे अपने ब्लॉग पर पोस्ट करने के लिए बहुत छोटा/विशिष्ट पाया गया, इसलिए मैंने इसे यहां क्यू एंड ए शैली पोस्ट की। –

+1

@JoLiss "super.merge" शैली के विकल्प के रूप में, आप 'विशेषताएँ: can_update,: can_delete' कह सकते हैं और फिर ser_izer को परिभाषित कर सकते हैं और serializer में विधियों के रूप में can_delete कर सकते हैं। या तो काम करता है, यद्यपि। – tee

2

हम एक मणि है कि इस सुविधा प्रदान करता है बनाया:

आप कैनकैन का उपयोग कर रहे हैं, तो आप can? विधि का उपयोग करने की क्षमता का वर्ग का दृष्टांत कर सकते हैं https://github.com/GroupTalent/active_model_serializers-cancan

2

मुझे लगता है कि आप कुछ भी पारित कर सकते हैं आप serialization_scope चाहते हैं तो मैं बस क्षमता को पास करता हूं।

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 

मैं अन्यथा नहीं कर सकता क्योंकि मेरी क्षमताओं वास्तव में दो चर पर आधारित हैं (ऊपर दिए गए उदाहरण में नहीं)।
यदि आपको अभी भी current_user तक पहुंच की आवश्यकता है तो आप आसानी से क्षमता पर एक आवृत्ति चर सेट कर सकते हैं।