के साथ अनुमतियों को क्रमबद्ध करें (उदा। कैनकन) सक्रिय_model_serializers के साथ अनुमतियों को क्रमबद्ध कैसे करें? मेरे पास current_user
या can?
मॉडल और सीरियलाइज़र में विधि तक पहुंच नहीं है।सक्रिय_model_serializers
उत्तर
पहले, 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
हम एक मणि है कि इस सुविधा प्रदान करता है बनाया:
आप कैनकैन का उपयोग कर रहे हैं, तो आप can?
विधि का उपयोग करने की क्षमता का वर्ग का दृष्टांत कर सकते हैं https://github.com/GroupTalent/active_model_serializers-cancan
मुझे लगता है कि आप कुछ भी पारित कर सकते हैं आप 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 तक पहुंच की आवश्यकता है तो आप आसानी से क्षमता पर एक आवृत्ति चर सेट कर सकते हैं।
मुझे समझ में नहीं आया - क्या आपने तुरंत अपने प्रश्न का उत्तर दिया? –
हां, मैंने किया - यह आलेख देखें (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/)। मैं चाहता था कि ज्ञान का यह टुकड़ा संरक्षित हो, लेकिन मुझे अपने ब्लॉग पर पोस्ट करने के लिए बहुत छोटा/विशिष्ट पाया गया, इसलिए मैंने इसे यहां क्यू एंड ए शैली पोस्ट की। –
@JoLiss "super.merge" शैली के विकल्प के रूप में, आप 'विशेषताएँ: can_update,: can_delete' कह सकते हैं और फिर ser_izer को परिभाषित कर सकते हैं और serializer में विधियों के रूप में can_delete कर सकते हैं। या तो काम करता है, यद्यपि। – tee