Search code examples
backbone.jsroutesruby-on-rails-3.2singlepage

How to handle non-root URLs in a singlepage app?


I try to make a single page app with Rails 3.2 and Backbone.js with pushState option but faced with something that I do not understand.

If I load the root URL of the app (/), everything goes right: Rails return an HTML-layout with JS which bootstraps Backbone which makes some XHRs for JSON-entities and renders the content.

But if I start using app from non-root URL (e.g. by manually typing it in the browser's address bar) then Rails will try to handle this request using theirs routing rules from routes.rb - that's wrong, cause it's a "Backbone's" route. How do I load the page and bootstrap Backbone for handling this URL in that case?


Solution

  • Finally I found the solution.

    I put the following code into my routes.rb

    class XHRConstraint
      def matches?(request)
        !request.xhr? && !(request.url =~ /\.json$/ && ::Rails.env == 'development')
      end
    end
    
    match '(*url)' => 'home#index', :constraints => XHRConstraint.new
    

    With this matcher all non-XHR requests are routed to HomeController which returns an HTML page. And XHR requests will be handled by other controllers which return JSON responses. Also I left requests ending with ".json" as valid in development environment for debugging.