主干,轨道,跨域和前端/后端去耦?

时间:2012-10-10 18:58:48

标签: ruby-on-rails backbone.js backend frontend decoupling

我需要解耦前端和后端。我正在使用Rails作为后端和Backbone用于前端。

经过几天的反复试验,我能够在服务器上设置CORS。一切都归功于这个模块:

https://github.com/yaoweibin/nginx_cross_origin_module

现在我发现Backbone不支持开箱即用的跨域调用。

我想知道将Backbone与后端分离的最佳方法是什么?

我看到两个解决方案:

1)在Backbone模型/集合中写入指向服务器的路径,所以我将得到例如:

class App.Collections.Plots extends Backbone.Collection
   model: App.Models.Plot
   url: 'http://www.app.com/api/plots'

这意味着我还必须修补Backbone方法以支持跨域。

2)以这样的方式设置前端部分的rails-side,Rails,而不是Backone将对服务器进行跨域调用..这看起来很奇怪,因为Backbone应该使分离变得更容易现在我将回归到rails解决方案。

1 个答案:

答案 0 :(得分:2)

现在我发现Backbone不支持开箱即用的跨域调用。

Backbone.js"支持"跨域调用。事实上,它并非特定于backbone.js,它是浏览器支持它的角色。在兼容CORS的浏览器中,每个请求(POST,GET)前面都有一个OPTIONS请求,用于检查服务器是否授权相应的POST或GET请求。

所以你只需要在rails应用程序中响应这个新的调用。例如:

class ApplicationController < ActionController::Base
  before_filter :cors_preflight_check
  after_filter :cors_set_access_control_headers

  # For all responses in this controller, return the CORS access control headers.
  def cors_set_access_control_headers
    headers['Access-Control-Allow-Origin'] = '*'
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
    headers['Access-Control-Max-Age'] = "1728000"
  end

  # If this is a preflight OPTIONS request, then short-circuit the
  # request, return only the necessary headers and return an empty
  # text/plain.
  def cors_preflight_check
    if request.method == :options
      headers['Access-Control-Allow-Origin'] = '*'
      headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
      headers['Access-Control-Allow-Headers'] = 'X-Requested-With, X-Prototype-Version'
      headers['Access-Control-Max-Age'] = '1728000'
      render :text => '', :content_type => 'text/plain'
    end
  end

end

这篇精彩帖子中的代码:http://www.tsheffler.com/blog/?p=428

因此,如果您的Nginx插件工作正常,您应该没问题。只需检查您的Access-Control-Allow-Origin标头是否包含执行javascript的域名。