2

我需要解耦前端和后端。我将 Rails 用于后端,将 Backbone 用于前端。

经过几天的反复试验,我能够在服务器上设置 CORS。多亏了这个模块:

https://github.com/yaoweibin/nginx_cross_origin_module

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

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

我看到两个解决方案:

1)在将指向服务器的主干模型/集合中写入路径,因此我将获得例如:

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

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

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

4

1 回答 1

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 的域。

于 2012-10-11T08:44:26.177 回答