2015-02-10 23 views
7

Tôi đang cố gắng làm điều gì đó đơn giản nhưng tôi không thể tìm ra giải pháp.Xác định mô hình dữ liệu ember cho url còn lại lồng nhau

Ứng dụng của tôi cần chỉnh sửa tài liệu chứa trang.

Đây là mô hình của tôi:

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() 
}); 

Và các tuyến đường:

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); 
    } 
}); 

Khi tôi nạp tài liệu 1, cuộc gọi ứng dụng http://www.myserver.com/api/document/1.

Vấn đề là khi tôi muốn tìm một trang của tài liệu, nó gọi

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

thay vì

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

Luận cương URL lồng nhau ar e quan trọng trong ứng dụng của tôi.

tôi tìm thấy những điều khác nhau về đề tài này như thêm links trong phản ứng JSON:

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

Nhưng khi tôi gọi cho các trang, nó yêu cầu http://www.myserver.com/api/document/1/pages mà không có id.

tôi cũng cố gắng xác định tài liệu khi tôi yêu cầu cho trang:

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

Không thể tìm thấy một tài liệu đầy đủ về vấn đề này, vì vậy nếu ai đó có thể giải thích cho tôi có chuyện gì vậy, tôi sẽ vui mừng.

Cảm ơn.

+0

Bạn có thể gửi các tuyến đường của bạn? –

+0

Ngoài ra, bạn đã giải trí các tuyến đường lồng nhau trong ứng dụng của mình nhưng vẫn giữ nguyên API phẳng - IE phơi bày 'http: // www.myserver.com/api/documents/1' và' http://www.myserver.com/api/pages/1' thay vì API lồng nhau. Bạn có kiểm soát được API không? –

+0

Điều quan trọng là phải có cấu trúc lồng nhau này trong API vì tôi cần biết tài liệu để tìm trang. Yêu cầu api trên tài liệu thực, không phải trên DB – thomaf

Trả lời

0

Sự cố của bạn có thể xuất phát từ các dấu ngoặc kép bao quanh các ID trong JSON của bạn. Nếu bạn sửa đổi bộ nối tiếp của mình để không có dấu ngoặc kép nào cho các ID xung quanh ID tài liệu và các ID trang, bạn sẽ nhận được hành vi mà bạn mong đợi. Ngoài ra, bạn cần phải sửa đổi các định dạng của liên kết của bạn để trỏ đến đường dẫn tương đối:

Các JSON kết quả sẽ giống như thế:

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

Xin xem this answer cho một mô tả về lý do tại sao sự tuân thủ theo nguyện vọng Ember của đối với đối với định dạng JSON là quan trọng và để có tổng quan về định dạng mong muốn.

+0

Ngay cả với các id không có dấu ngoặc kép và khai báo "liên kết" này "/ tài liệu/1/trang", URL được yêu cầu là: http://www.myserver.com/api/ tài liệu/1/trang. Khi tôi loại bỏ tuyên bố "liên kết" này, tôi nhận được ID: http://www.myserver.com/api/pages/ID – thomaf

+0

Tôi không thể nhìn thấy bit cuối cùng của nhận xét của bạn nhưng tôi giả định rằng bạn có nghĩa là nó vẫn cố gắng truy xuất 'http: // www.myserver.com/api/document/1/pages' và không phải' http: // www.myserver.com/api/document/1/pages/1' –

+0

Có. Dữ liệu Ember có lẽ không dành cho tôi;) – thomaf

3

Phụ thuộc: EMBER DATA> = V1.0.0-BETA.9

Cách để xử lý các tuyến đường lồng nhau được ẩn dưới release notes

  1. Bạn cần gửi lại liên kết với phản ứng như thế này

    { 
        "document": { 
        "id": 1, 
        "title": "Titre du document", 
        "links": {"pages" : "/documents/1/pages"} 
    } 
    
  2. Bạn sẽ cần để tùy chỉnh adapter:page ' s buldUrl phương pháp như

    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 thích nghi với Ember 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; 
    } 
}); 
Các vấn đề liên quan