Rails, Backbone, PhoneGap, CORS (не разрешено из-за ошибки Access-Control-Allow-Origin)

Я создаю приложение Phonegap, в котором используется backbone.js и бэкэнд Rails. При создании новых пользователей я получаю сообщение об ошибке, связанной с CORS:

Я запускаю свое веб-приложение PhoneGap на http://0.0.0.0:8000 ($ python -m SimpleHTTPServer) и запускаю свое приложение Rails в webrick на http://0.0.0.0:3000 ($ rails server).

Проблема возникает при попытке создать новый "Spot" в Backbone следующим образом (консоль 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

Я прочитал множество статей, и самое далекое, что я смог продвинуть, было при изменении моего route.rb, чтобы включить это:

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

И в моем application_controller.rb

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

Добавление маршрута и метода «cor» позволит мне делать сохранения, но у меня будет такая же ошибка при удалении записей.

Я понимаю основную идею CORS, я не могу получить доступ к серверу с доменом, отличным от домена источника моего запроса. Но как именно настроить это с помощью Rails, Backbone, Phonegap, мне непонятно. Любая помощь будет потрясающей, спасибо!


person botbot    schedule 17.12.2012    source источник
comment
+1 за match '*all' => 'application#cor', :constraints => {:method => 'OPTIONS'}   -  person user2503775    schedule 22.10.2013


Ответы (1)


Я следил за этой статьей (раздел "CORS в Rails"), и она работает для меня.

Я меняю if request.method == :options на if request.method == 'OPTIONS' и добавляю методы PUT, DELETE на headers['Access-Control-Allow-Methods']. Вместо «*» в Access-Control-Allow-Origin у меня есть localhost: 8080 (я запускаю свое приложение на nginx).

Надеюсь, это поможет.

PD: У вас есть фильтры (хуки) в вашем контроллере приложений?

person cortex    schedule 19.12.2012