无法分离Backbone和Rails路由

时间:2015-04-06 02:13:38

标签: ruby-on-rails api backbone.js routing

我是Backbone的新手,所以作为一个学习练习,我正在尝试使用Rails后端设置一个简单的应用程序。我正在努力分离Rails api路由和Backbone路由。 例如,我的Backbone路由器目前看起来像这样:

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 / resource”命名空间下,而Backbone将处理简单的“/ resource”路由,然后在处理函数中调用API。

最初我创建了一个Flow模型

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

据我所知,应与此Backbone路由匹配

'flows/:id': 'showFlow'

然而,它继续在/ flow /:id处访问API,因为Rails中不存在该路由,所以会抛出错误。

  1. 我在这里缺少什么?
  2. 为什么Backbone路由没有被触发?
  3. 这是在Backbone中分离客户端和服务器端路由的正确方法吗?
  4. 谢谢!

1 个答案:

答案 0 :(得分:0)

如果你没有使用pushState,那么href属性中的url应该是:

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

由于#缺少它直接尝试导航到url而不是实例化路由器。

如果您使用的是html pushState,那么您需要遵循以下内容: https://stackoverflow.com/a/9331734/741108

如果您希望您的模型/集合和路由器网址看起来类似,那么您可以使用$ .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在预过滤器中被框起来。