如何在不同的子域上从Backbone应用程序到Rails应用程序进行POST、PUT和DELETE操作?

b5buobof  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(130)

在不同的子域上,从Backbone应用程序到Rails应用程序进行POST、PUT和DELETE的最佳方式是什么?
我试过用Backbone从Rails应用程序中获取一些数据,它工作正常。我试过用Backbone将新内容保存到Rails应用程序中。
我在PUT(更新数据库中创建的模型)方面真实的问题。我不知道为什么,但是当我在我的 Backbone.js 应用程序中这样做的时候:(book.save:)
而这本书是一个已经存在于数据库中的模型;它不是向Rails应用程序发送PUT请求,而是发送OPTIONS请求,并且不包含数据。
理想情况下,我希望从Backbone应用程序向Rails应用程序发送PUT请求,这样我就可以在Rails应用程序中执行以下操作:
帐簿.update_attributes参数[:book]
Rails应用程序和Backbone应用程序位于同一顶级域的不同子域中。

pcww981p

pcww981p1#

对于不是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

相关问题