Rails、Backbone、PhoneGap、CORS(Access-Control-Allow-Origin 错误不允许)

Posted

技术标签:

【中文标题】Rails、Backbone、PhoneGap、CORS(Access-Control-Allow-Origin 错误不允许)【英文标题】:Rails, Backbone, PhoneGap, CORS (not allowed by Access-Control-Allow-Origin error) 【发布时间】:2012-12-04 07:43:34 【问题描述】:

我正在使用backbone.js 和Rails 后端构建一个Phonegap 应用程序。创建新用户时,我收到与 CORS 相关的错误:

我正在http://0.0.0.0:8000 ($ python -m SimpleHTTPServer) 上运行我的 PhoneGap Web 应用程序,并在 http://0.0.0.0:3000 ($ rails 服务器) 上的 webrick 中运行我的 Rails 应用程序。

当试图在 Backbone 中创建一个新的“Spot”时会出现问题(chrome js 控制台):

> s = new App.Models.Spot()
(creates Spot)
> s.save()
(returns error Object)
OPTIONS http://0.0.0.0:3000/spots.json 404 (Not Found) jquery-1.8.2.js:8416
XMLHttpRequest cannot load http://0.0.0.0:3000/spots.json. Origin http://0.0.0.0:8000 is not allowed by Access-Control-Allow-Origin.

这是我的应用程序控制器:

def set_access_control_headers
  headers['Access-Control-Allow-Origin'] = 'http://0.0.0.0:8000'
  headers['Access-Control-Request-Method'] = 'POST, GET'
end

我已经阅读了许多文章,我能得到的最远的文章是在修改我的 routes.rb 以包含以下内容时:

match '*all' => 'application#cor', :constraints => :method => 'OPTIONS'

在我的 application_controller.rb 中

def cor
  headers["Access-Control-Allow-Origin"] = "*"
  headers["Access-Control-Allow-Methods"] = %wGET POST PUT DELETE OPTIONS.join(",")
  headers["Access-Control-Allow-Headers"] = %wOrigin Accept Content-Type X-Requested-With X-CSRF-Token.join(",")
  head(:ok) if request.request_method == "OPTIONS"
end

添加路由和“cor”方法将允许我进行保存,但是在删除记录时我会遇到同样的错误。

我了解了 CORS 的基本概念,我无法访问域与我的请求来源不同的服务器。但是我不清楚如何使用 Rails、Backbone、Phonegap 进行设置。任何帮助都会很棒,谢谢!

【问题讨论】:

match '*all' => 'application#cor', :constraints => :method => 'OPTIONS'+1 【参考方案1】:

我关注了this article(“Rails 中的 CORS”部分),它对我有用。

我将if request.method == :options 更改为if request.method == 'OPTIONS' 并将方法PUT、DELETE 添加到headers['Access-Control-Allow-Methods']。在Access-Control-Allow-Origin 中插入“*”我有 localhost:8080(我在 nginx 上运行我的应用程序)。

希望这会有所帮助。

PD:您的应用程序控制器中有过滤器(挂钩)吗?

【讨论】:

以上是关于Rails、Backbone、PhoneGap、CORS(Access-Control-Allow-Origin 错误不允许)的主要内容,如果未能解决你的问题,请参考以下文章

基于backbone.js/ember.js的app和基于Phonegap/Sencha Touch的app有啥区别?

如何开始使用 Backbone.js 和 Rails 3.1

Backbone.js 前端和 RESTful Rails 后端?

Backbone 和 Rails 关联:避免 JSON HashWithIndifferentAccess 错误

markdown Rails和Backbone.js设置

PhoneGap 和 rails 3:如何与 rails 3 应用程序交互