2015-02-10 6 views
7

के लिए एम्बर डेटा मॉडल को परिभाषित करें मैं कुछ ऐसा करने की कोशिश कर रहा हूं जो सरल लगता है लेकिन मुझे समाधान नहीं मिल रहा है।नेस्टेड बाकी यूआरएल

मेरे एप्लिकेशन को उन दस्तावेज़ों को संपादित करने की आवश्यकता है जिनमें पृष्ठ शामिल हैं।

MyApplication.Document = DS.Model.extend({ 
    title: DS.attr('string'), 
    pages: DS.hasMany('page', {async: true}) 
}); 
MyApplication.Page = DS.Model.extend({ 
    document: DS.belongsTo('document', {async: true}), 
    title: DS.attr('string'), 
    params: DS.attr(), 
    objects: DS.attr() 
}); 

और मार्गों:

यहाँ मेरी मॉडल है

MyApplication.Router.map(function() { 
    this.resource('document', {path: '/document/:document_id'}); 
}); 
MyApplication.Document = Ember.Route.extend({ 
    model: function (params) { 
     return this.store.find('document', params.document_id); 
    } 
}); 

जब मैं दस्तावेज़ 1, आवेदन कॉल http://www.myserver.com/api/document/1 लोड।

समस्या यह है कि जब मैं दस्तावेज़ के एक पृष्ठ खोजना चाहते हैं, यह

  • http://www.myserver.com/api/pages/ID
बजाय

  • http://www.myserver.com/api/document/1/pages/ID

शोध कहता है नेस्टेड यूआरएल आर और मेरे आवेदन में महत्वपूर्ण है।

मैं JSON उत्तर में links को जैसे चाहें इस विषय पर अलग अलग बातें पाया:

{ 
    "document": { 
     "id": "1", 
     "title": "Titre du document", 
     "pages": ["1", "2", "3"], 
     "links": {"pages" : "pages"} 
}, 

लेकिन जब मैं पृष्ठों के लिए कहते हैं, यह आईडी के बिना http://www.myserver.com/api/document/1/pages अनुरोध करता है।

मैं भी जब मैं पृष्ठ के लिए पूछने के दस्तावेज़ निर्दिष्ट कोशिश:

this.store.find("page", 1, {document:1}); 

इस विषय पर एक पूर्ण प्रलेखन नहीं खोजा जा सका है, इसलिए यदि किसी को क्या गलत है मुझे समझा सकता है, मैं हो जाएगा खुश।

धन्यवाद।

+0

आप अपने मार्गों पोस्ट कर सकते हैं? –

+0

इसके अलावा, क्या आपने अपने आवेदन में घोंसले वाले मार्गों का मनोरंजन किया है, लेकिन एपीआई फ्लैट - आईई को 'http: // www.myserver.com/api/दस्तावेज़/1' और' http://www.myserver.com/api ' एक नेस्टेड एपीआई के बजाय/पेज/1'। क्या आप एपीआई के नियंत्रण में हैं? –

+0

एपीआई में यह नेस्टेड संरचना प्राप्त करना महत्वपूर्ण है क्योंकि मुझे पृष्ठ खोजने के लिए दस्तावेज़ को जानने की आवश्यकता है। वास्तविक दस्तावेज पर एपीआई अनुरोध, डीबी – thomaf

उत्तर

0

आपकी समस्या संभावित रूप से आपके JSON में ID के आस-पास के उद्धरणों से उत्पन्न होती है। यदि आप अपने सीरिएलाइज़र को संशोधित करते हैं ताकि दस्तावेज़ आईडी और पेज आईडी के आसपास आईडी के लिए कोई उद्धरण न हो, तो आपको वह व्यवहार मिलना चाहिए जो आप उम्मीद करते हैं। इसके अलावा, आप रिश्तेदार पथ को इंगित करने के लिए अपने लिंक का स्वरूप परिवर्तित करने की आवश्यकता है:

जिसके परिणामस्वरूप JSON दिखना चाहिए:

{ 
    "document": { 
     "id": 1, 
     "title": "Titre du document", 
     "pages": [1, 2, 3], 
     "links": {"pages" : "/documents/1/pages"} 
} 

कृपया संबंध में एंबर की उम्मीदों को क्यों पालन के वर्णन के लिए this answer देखना जेएसओएन प्रारूप में महत्वपूर्ण है और अपेक्षित प्रारूप के अवलोकन के लिए।

+0

पर उद्धरण के बिना आईडी और यहां तक ​​कि "लिंक" घोषणा "/ दस्तावेज/1/पृष्ठ" के साथ, अनुरोध किया गया यूआरएल है: http://www.myserver.com/api/ दस्तावेज़/1/पृष्ठों की है। जब मैं इस "लिंक" घोषणा को हटा देता हूं, तो मुझे आईडी मिलती है: http://www.myserver.com/api/pages/ID – thomaf

+0

मैं आपकी टिप्पणी का अंतिम भाग नहीं देख सकता लेकिन मुझे लगता है कि आपका मतलब है अभी भी 'http: // www.myserver.com/api/document/1/pages' को पुनर्प्राप्त करने का प्रयास करता है, न कि' http: // www.myserver.com/api/document/1/pages/1' –

+0

हां। एम्बर डेटा शायद मेरे लिए नहीं है;) – thomaf

3

निर्भर करता है: एम्बर डेटा> = V1.0.0-BETA।9

रास्ता नेस्टेड मार्गों को संभालने के लिए release notes

  1. के नीचे छिपा है इस

    { 
        "document": { 
        "id": 1, 
        "title": "Titre du document", 
        "links": {"pages" : "/documents/1/pages"} 
    } 
    
  2. की तरह प्रतिक्रिया के साथ लिंक वापस भेजने की आवश्यकता है adapter:page 'अनुकूलित करने के लिए आप की आवश्यकता होगी buldUrl विधि

    MyApplication.PageAdapter = DS.RestAdapter.extend({ 
        // NOTE: this is just a simple example, but you might actually need more customization when necessary 
        buildURL: function(type, id, snapshot) { 
        return '/documents/' + snapshot.record.get('document.id') + '/pages/' + id; 
        } 
    }); 
    
2

@code-jaff answer एंबर 2.1.0 के लिए अनुकूलित:

// app/adapters/page.js 
import DS from './application'; // I suppose you have your adapter/application.js 

export default DS.RESTAdapter.extend({ 
    buildURL: function(type, id, snapshot) { 
    return this.host + '/' + this.namespace + '/documents/' + snapshot.record.get('document.id') + '/pages/' + id; 
    } 
}); 
संबंधित मुद्दे