1

Whick 是在不同子域上从 Backbone 应用程序到 Rails 应用程序 POST、PUT 和 DELETE 的最佳方式?

我试图从 Rails 应用程序中使用 Backbone 获取一些数据并且它可以工作。我尝试使用 Backbone to Rails 应用程序保存新内容。

我对 PUT 有真正的问题(更新数据库中创建的模型)。我不知道为什么,但是当我在我的主干应用程序中执行以下操作时: book.save()

这本书是一个已经存在于数据库中的模型,而不是向 Rails APP 发送 PUT 请愿书,而是发送 OPTIONS 请愿书,并且没有数据。

理想情况下,我想从 Backbone 应用程序向 Rails 应用程序发送一个 PUT 请求,这样我就可以在我的 Rails 应用程序中执行以下操作:

Book.update_attributes 参数[:book]

Rails 应用程序和 Backbone 应用程序位于同一顶级域的不同子域上。

4

1 回答 1

1

对于不是 post 或 get 的方法,客户端将发送一个 OPTIONS 请求以确定允许跨域的内容。你需要两件事。您需要一种方法来使用正确的响应标头进行响应,以告诉客户端跨域是可以的。我在 ApplicationController 中创建了一个 after_filter,因为我的跨域需求是系统范围的。

after_filter :allow_cross_domain

def allow_cross_domain
  headers["Access-Control-Allow-Origin"] = request.env['HTTP_ORIGIN']
  headers["Access-Control-Request-Method"] = "*"
  headers["Access-Control-Allow-Methods"] = "PUT, OPTIONS, GET, DELETE, POST"
  headers['Access-Control-Allow-Headers'] = '*,x-requested-with,Content-Type'
  headers["Access-Control-Max-Age"] = 1728000
end

接下来,您需要在您的 routes.rb 中处理选项请求

match "*options", controller: "application", action: "options", constraints: { method: "OPTIONS" }

并在将处理请求的控制器中(对我来说是 ApplicationController)

def options
  allow_cross_domain
  render :text => "", :layout => false
end
于 2012-04-20T17:13:33.997 回答