2015-04-06 71 views
1

我是Backbone的新手,所以學習練習我試圖用Rails後端設置一個簡單的應用程序。我正在努力分離Rails API路線和Backbone路線。 比如我的骨幹路由器目前看起來是這樣的:無法分離主幹和Rails路線

class App.Routers.LawAppRouter extends Backbone.Router 
    routes: 
    '': 'index' 
    'flows/:id': 'showFlow' 

index: -> 
    flows = new App.Collections.Flows() 
    flows.fetch().done => 
    view = new App.Views.Flows(collection: flows) 
    $('#container').html(view.render().el)  

showFlow: (id) -> 
    alert('in showFlow) 

我想要做的是讓Rails的API活「API/V1 /資源」命名空間下,而骨幹網將處理簡單的「/資源」路線然後在處理函數中調用API。

起初我創建了一個流動模型

class App.Models.Flow extends Backbone.Model 

集合

class App.Collections.Flows extends Backbone.Collection 
    url: 'api/v1/flows' 
    model: App.Models.Flow 

和索引視圖

<ul> 
    <% for flow in @flows.models: %> 
    <li> 
     <a href="<%= flow.url() %>"><%= flow.get('title') %></a> 
    </li> 
    <% end %> 
</ul> 

寫這樣一來,flow.url()返回

api/v1/flows/:id 

直接命中API。相反,我想flow.url()來生成客戶端路線

flows/:id 

所以我改變了模型是

class App.Models.Flow extends Backbone.Model 
    clientSideUrl: -> 
    "flows/#{@id}" 

和索引視圖

<a href="<%= flow.clientSideUrl() %>"><%= flow.get('title') %></a> 

哪現在生成

flows/:id 

其中,據我瞭解,應該與此主幹航線

'flows/:id': 'showFlow' 

然而,而是不斷打在API /流/:身份證,因爲這條路線並不在Rails的存在會拋出一個錯誤。

  1. 我在這裏錯過了什麼?
  2. 爲什麼骨幹路由不被觸發?
  3. 這是在Backbone中分離客戶端和服務器端路由的正確方法嗎?

謝謝!

回答

0

如果你不使用pushState的那麼href屬性中的URL應該是:

<a href="<%= #/flow.clientSideUrl() %>"><%= flow.get('title') %></a> 

由於#缺少其試圖直接導航到該網址,而不是實例化的路由器。

如果您使用的HTML pushState的,那麼你需要按照這樣的事情: https://stackoverflow.com/a/9331734/741108

如果你希望你的型號/系列和路由器的URL看起來很相似,那麼你可以使用$的。ajaxPrefilter

// root = 'http://your.domain.com/api/v1' 
$.ajaxPrefilter(function(options,orginalOptions,jqXHR){ 
    options.url = root + options.url;  
}); 

每個AJAX調用現在走通前置過濾器之前調用實際上是由。

因此,模型(urlRoot)和集合(url)在它們的定義中可以具有相似的url,它們看起來可能類似於Routes url,並且當進行服務器調用時,完整的url在預過濾器中被構造。