如何处理单页面应用程序中的非root URL?

fey*_*fey 6 routing singlepage backbone.js ruby-on-rails-3.2

我尝试使用带有pushState选项的Rails 3.2和Backbone.js制作单页应用程序,但遇到了一些我不理解的东西.

如果我加载应用程序的根URL(/),一切顺利:Rails返回一个带有JS的HTML布局,它引导Backbone,它为JSON实体制作一些XHR并呈现内容.

但是如果我从非root URL开始使用app (例如通过在浏览器的地址栏中手动输入),那么Rails将尝试使用来自routes.rb的路由规则处理此请求 - 这是错误的,因为它是一个"Backbone"路由.在这种情况下,如何加载页面并引导Backbone以处理此URL?

fey*_*fey 14

最后我找到了解决方案.

我将以下代码放入我的routes.rb中

class XHRConstraint
  def matches?(request)
    !request.xhr? && !(request.url =~ /\.json$/ && ::Rails.env == 'development')
  end
end

match '(*url)' => 'home#index', :constraints => XHRConstraint.new
Run Code Online (Sandbox Code Playgroud)

使用此匹配器,所有非XHR请求都将路由到返回HTML页面的HomeController.并且XHR请求将由返回JSON响应的其他控制器处理.此外,我将以".json"结尾的请求留在开发环境中作为调试有效.

  • 谢啦!不得不将行更改为能够在Rails 4中工作:`get'*path'=>'home #index',: constraints => XHRConstraint.new` (6认同)