2013-07-20 10 views
17

मैं ActiveModel :: Serializers का उपयोग कर एक एपीआई बना रहा हूं। पैराम का उपयोग करके सशर्त रूप से डेटा को सीलोड करने का सबसे अच्छा तरीका क्या है?सिक्योरोडिंग सक्रिय रूप से ActiveModel :: Serializers

तो मैं GET /api/customers की तरह अनुरोध कर सकता है:

"customers": { 
    "first_name": "Bill", 
    "last_name": "Gates" 
} 

और GET /api/customers?embed=address,note

"customers": { 
    "first_name": "Bill", 
    "last_name": "Gates" 
}, 
"address: { 
    "street": "abc" 
}, 
"note": { 
    "body": "Banned" 
} 

कुछ पैरामीटर के आधार पर उस तरह। मुझे ActiveModel पता है :: Serializers include_[ASSOCIATION]? सिंटैक्स है लेकिन मैं अपने नियंत्रकों से कुशलतापूर्वक इसका उपयोग कैसे कर सकता हूं?


यह मेरे वर्तमान समाधान है, लेकिन यह साफ नहीं है:

customer_serializer.rb:

def include_address? 
    !options[:embed].nil? && options[:embed].include?(:address) 
end 

application_controller.rb:

def embed_resources(resources = []) 
    params[:embed].split(',').map { |x| resources << x.to_sym } if params[:embed] 
    resources 
end 

customers_controller.rb:

def show 
    respond_with @customer, embed: embed_resources 
end 

एक आसान तरीका होना चाहिए?

उत्तर

8

मैं यह करने के लिए एक प्रभावी और साफ तरीका भी ढूंढ रहा हूं।

मुझे एक समाधान मिला लेकिन यह सुंदर नहीं है।

मेरी BaseController/ApplicationController में मैं इस विधि कहा:

serialization_scope :params 

तो गुंजाइश अब पैरामीटर हैश है और मैं अपने serializers की include_[ASSOCIATION]? तरीकों में इसका इस्तेमाल कर सकते हैं।

def include_associations? 
    if scope[:embed] 
     embed = scope[:embed].split(',') 
     return true if embed.include?('associations') 
    end 
end 

मैं इस विधि पसंद नहीं है क्योंकि अगर मैं किसी और current_user की तरह कुछ के लिए गुंजाइश उपयोग करने के लिए सशर्त डेटा लौटाने के लिए अगर यह उदाहरण के लिए व्यवस्थापक है की जरूरत है।

लेकिन यह समाधान कुछ मामलों में काम कर सकता है।

अद्यतन

आप view_context पारित कर सकते हैं के बजाय सीधे params गुजरती हैं।

और scope के बजाय params नाम रखने के लिए आप अपने सीरियलज़र में प्रतिनिधिमंडल कर सकते हैं।

अपने ApplicationController में

:

serialization_scope :view_context 

अपने serializer में:

delegate :params, to: :scope 

और देखा आप पैरामीटर का उपयोग कर सकते हैं: अपने serializers की include_[ASSOCIATION]? तरीकों में [एम्बेड]।

+0

मुझे view_context का उपयोग करके आपके सुझाव पसंद हैं। क्या आरएसपीईसी के साथ यूनिट का परीक्षण करना संभव है? – Richard

+0

मैंने आपको यह दिखाने के लिए अपना प्रश्न अपडेट कर दिया है कि मैं इसे कैसे कर रहा हूं। – Richard

+0

शानदार उत्तर, धन्यवाद @lou। बहुत खूबसूरत। – tristanm

2

मेरे पास अभी तक आपके उत्तरों के आधार पर एक और समाधान है क्योंकि मैं समान कार्यक्षमता चाहता था। दस्तावेज़ीकरण के अनुसार यदि कोई एसोसिएशन क्रमबद्धता के निम्न स्तर नियंत्रण चाहता है, तो वे include_associations! ओवरराइड कर सकते हैं।

उदाहरण के लिए:

def include_associations! 
    if scope[:embed] 
     include! :addresses, {embed: :ids, include: true} 
    else 
     include! :addresses, {embed: :ids} 
    end 
end 
1

include_associations के बारे में पता करने के लिए बहुत उपयोगी !, धन्यवाद! यह देखते हुए कि active_model_serializers मणि (संस्करण 0.8.3) के साथ आप नियंत्रक में संदर्भ सेट करने के लिए @options का उपयोग कर सकते हैं। उदाहरण के लिए, यदि नियंत्रक में आप

render json: customer, include_addresses: true 

तो CustomerSerializer में कहते हैं:

has_many :addresses 
def include_associations! 
    if @options[:include_addresses] 
    include! :addresses 
    end 
end 

तो पतों धारावाहिक की जाएगी। यदि आप include_addresses के साथ false पर सेट करते हैं, तो वे नहीं होंगे। active_model_serializers के नए संस्करणों के साथ, @options के बजाय serialization_options का उपयोग करें।

संबंधित मुद्दे