2016-02-22 31 views
0

我有一個Ember應用程序設置,它從Rails API獲取數據。我現在有工作路線設置,但不是我想要的。當前的路由結構(餘燼應用程序)是這樣的:Ember設置路線以從Rails API獲取關聯數據

//router.js 
Router.map(function() { 
    this.route('surveys'); 
    this.route('survey', { path: 'surveys/:survey_id' }, function() { 
    this.route('sections', { path: '/sections' }); 
    }); 

    this.route('section', {path: 'surveys/:survey_id/sections/:section_id'}, function() { 
    this.route('survey_items', { path: 'survey-items' }); 
    }); 

}); 

在我調查的模式,每個調查有許多部分,每個部分有很多調查項目。它的設置方式現在有點不錯,但我的堅持點是,如果我轉到section路線,我希望有一個「下一個」按鈕,當您點擊它時,它會將您帶到該調查的下一部分。現在我無法正確地做到這一點,因爲我的section路由通過僅通過傳入的id參數查找節來加載模型。如果所有調查的所有部分都已加載到商店中,並且我現在增加該部分,則無論與哪個survey_id相關聯,它都會轉到下一部分。我無法弄清楚如何更好地設置我的路線來完成這項工作。

軌道API路線看起來像現在這種權利:

routes.rb 
namespace :api do 
    namespace :v1 do 
    resources :surveys, shallow:true do 
     resources :sections, shallow: true do 
     resources :survey_items, path: '/survey-items' 
     end 
    end 
    end 
end 

正如你所看到的,在Rails的路線,我把shallow: truesurveyssections資源。出於某種原因,當我將它們嵌套在沒有淺層路由的情況下時,如果不嵌套嵌入UI的我的ember路由,我就無法加載正確的路由,這是我不想要的。任何人都可以給我任何提示,告訴我如何設置我的路線,而不需要軌道中的淺層路線(如果可能),以及我應該如何獲取每個路段的模型數據,以便我可以轉到相關調查的下一部分?

section當前路線模型獲取這樣目前:

model(params) { 
    return this.store.findRecord('section', params.section_id, { reload: true }); 

} 

回答

0

我不知道如何設置淺:在你的routes.rb文件真實。但是,對於UI,我會在survey模型上使用Ember Data的hasMany方法。

// survey.js 
import DS from 'ember-data'; 

export default DS.Model.extend({ 
    sections: DS.hasMany('section') 
}); 

如果您獲取調查時,序列化links屬性,你可以直接hasMany你的API在特定端點,只是處理範圍界定各部分,在控制器的具體調查。如何序列化您SurveySerializer(假設你使用ActiveModelSerializers)的links屬性的例子:

def links 
    { 
    sections: api_v1_survey_sections_path 
    } 
end 

然後在用戶界面中的sections條路,我會在你的模型鉤只返回這些調查的部分:

// sections.js 
import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model: function() { 
    var survey = this.modelFor('survey'); 

    return survey.get('sections'); 
    } 
}); 

我會在sections模板中將link-to作爲section路線。 sections控制器將根據「下一個」的內容來管理您將傳遞給其動態細分的id或模型。傳遞一個模型可能是有意義的,而不是一個id,所以section模型鉤子將被跳過。

最後,有沒有什麼理由不在你的router.js這樣的文件中寫你的路線?

// router.js 
Router.map(function() { 
    this.route('surveys'); 
    this.route('survey', { path: 'surveys/:survey_id' }, function() { 
    this.route('sections', function() { 
     this.route('section', {path: ':section_id'}, function() { 
     this.route('survey_items', { path: 'survey-items' }); 
     }); 
    }); 
    }); 
}); 
+0

感謝您的建議,這絕對是我迄今爲止發現的最有用的信息。至於路由器。js路由,我沒有這樣寫,因爲這些路由不嵌套在UI中。有單獨的頁面用於顯示初始調查詳細信息和調查中的所有部分,然後是每個部分的單獨頁面,以便路由無法嵌套,或者根據我的理解嵌套UI。 – mikeLspohn