2011-06-07 14 views
23

एक मानक रेल नियंत्रक में, मैं इस तरह के रिकॉर्ड बनाने चाहते हैं:बैकबोन.जेएस और रेल - बैकबोन मॉडल से पैरा कैसे संभालें?

@user = User.new(params[:user]) 

मतलब यह है कि कि में आते प्रपत्र मापदंडों नेस्टेड रहते हैं।

मैं बैकबोन.जेएस के साथ खेल रहा हूं और मैंने देखा कि डिफ़ॉल्ट रूप से, बैकबोन पैरामीटर को सामान्य रेल फॉर्म के रूप में घोंसला नहीं करता है, जो वास्तव में मुझे उम्मीद है। तो मैं सोच रहा हूँ मुझे क्या करना चाहिए ...

मैं बाहर क्या

आंकड़ा सर्वर साइड पर अगर यह देख कर बैकबोन से एक अनुरोध है हेडर, आदि स्वीकार करता है और हेरफेर तो अपने आप को परम मैं कर सकते हैं मेरी नियंत्रक कोड छोटा रखने:

do_some_params_manipulation_with(params) 
@user = User.new(params[:user]) 
respond_to do |format| 
    if @user.save 
    format.html {redirect_to users_url} 
    format.json {render :json => @user.to_json } 
    end 
end 

या, मैं एक शाखा है जो बार-बार कोड के साथ समाप्त होता है लेकिन लंबे समय में अधिक maintainable हो सकता है में वस्तु का दृष्टांत करना ....

respond_to do |format| 
    format.html do 
    @user = User.new(params[:user]) 
    if @user.save 
     redirect_to users_url 
    end 
    end 

    format.json do 
    @user = User.new(params) # and rely on mass-assignment protection 
    if @user.save 
     render :json => @user.to_json 
    end 
    end 

end 

या क्या मैं अपने बैकबोन.जेएस मॉडल को .toJSON विधि को ओवरराइड करके संशोधित करता हूं (जो मुझे पूरी तरह से सुनिश्चित नहीं है कि मुझे कैसे करना है क्योंकि मुझे अभी तक बैकबोन.जेएस के बारे में पर्याप्त जानकारी नहीं है) ताकि यह पैराम्स को घोंसला दे?

इस स्थिति में, मेरे पास ऐप के दोनों किनारों तक पहुंच है, लेकिन मुझे दिलचस्पी है कि दूसरे क्या कर रहे हैं।

उत्तर

36

यह अच्छा है जब आप रूट नोड के संबंध में सामान्य रेल फॉर्म और बैकबोन फॉर्म मिलान कर सकते हैं। यही कारण है कि मेरे आखिरी आवेदन में मैंने बैकबोन मॉडल 'toJSON विधि को ओवरराइड करना चुना।

आप वैश्विक toJSON विधि as Raimonds Simanovskis suggested को ओवरराइड कर सकते हैं। लेकिन यहां तक ​​कि गैर-डीआरवाई रास्ता भी इतना बुरा नहीं है। बस एक-एक मॉडल परिभाषा के लिए बॉयलरप्लेट की लाइन:

// Depends on Underscore.js 
User = Backbone.Model.extend({ 
    toJSON: function() { 
    return { user: _.clone(this.attributes) } 
    }, 
    // Your other methods here 
}); 

संपादित करें: सही कोड नमूना। त्रुटियों के लिए खेद है, मैं कॉफीस्क्रिप्ट से जावास्क्रिप्ट में अनुवाद कर रहा था।

+1

मैंने यह जवाब स्वीकार कर लिया है क्योंकि यह पैसे पर बहुत अधिक है, लेकिन मैंने इसे सर्वर की ओर से संभालने का फैसला किया। –

+0

तो अभी तक इतना स्पष्ट है। इसके लिए धन्यवाद। – Cory

+0

'this.constructor.name.toLowerCase()' को मूल मॉडल ऑब्जेक्ट 'App.Model' पर ऑब्जेक्ट कुंजी के रूप में उपयोग किया जा सकता है जो 'Backbone.Model' को बढ़ाता है। –

4

मैंने model.name प्रॉपर्टी के तहत नेमस्पेस अनुरोधों को सहेजने के लिए थोड़ा हैक बनाया है। यह बंदर toJSON()sync() के दौरान केवल कॉल करता है और मूल विधि को पुनर्स्थापित करता है ताकि आप इसे सामान्य रूप से उपयोग कर सकें।

मैंने इसे कॉफीस्क्रिप्ट में लागू किया है।

Check it here

+0

इस के लिए बहुत बहुत धन्यवाद। –

1

रेल 3.1 के रूप में वहाँ अब एक नया प्रारंभकर्ता wrap_parameters.rb कहा जाता है जो डिफ़ॉल्ट रूप से इस समस्या को संभालती है। इस मामले को संभालने वाला कोड है:

# Disable root element in JSON by default. 
ActiveSupport.on_load(:active_record) do 
    self.include_root_in_json = false 
end 

बाडा बिंग!

+0

आइटम की सूची लौटने पर यह सुरक्षा जोखिम के रूप में सामने आया है। इसके खिलाफ सुरक्षा के लिए रूट नोड हमेशा शामिल किया जाना चाहिए। http://haacked.com/archive/2009/06/24/json-hijacking.aspx – Altonymous

+0

सबसे निश्चित रूप से पढ़ने लायक है। लिंक में धागे के अंत में कुछ अच्छे अंक। रेल पर्यावरण में, उन मामलों को रोकने के लिए कुछ अंतर्निहित जांच है जिनमें इस शोषण का उपयोग किया जा सकता है ... जो यह नहीं कहना है कि रूट नोड को लूप करने का अधिकार है। –

9

आप backbone-rails मणि का उपयोग कर रहे हैं, तो लगता है कि आप पर github

क्रेडिट पी एल जे

var User = Backbone.Model.extend({ 
    paramRoot: 'user' 
}); 

लाइन 45 के आसपास है और इस link

+0

कमाल! कभी नहीं जानता था कि इसमें शामिल है। – Duke

+4

नवीनतम रीढ़ की हड्डी के साथ काम नहीं करता है – kravc

3

पर धारा 7 कर सकते हैं ऐसा लगता है कि यदि आप वर्तमान में स्वीकृत उत्तर (मॉडल स्तर पर जेएसओएन को पैच करना) चुनते हैं तो आप भी पढ़ने को प्रभावित कर रहे हैं। शायद यह कहने के बिना चला जाता है, शायद नहीं। लेकिन यदि आप इस पैच को रीढ़ की हड्डी में प्रभावित करते हैं तो मॉडलों/संग्रहों को प्रस्तुत करते समय आपके पास बहुत काम करना होगा। इसलिए, मैं व्यक्तिगत रूप से इसका उपयोग नहीं करता।

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