2012-12-17 6 views
6

Sto costruendo un'app Phonegap che utilizza backbone.js e un back-end Rails. Durante la creazione di nuovi utenti, sto ottenendo un errore di CORS correlati:Rails, Backbone, PhoneGap, CORS (non consentito da Access-Control-Allow-Origin error)

sto facendo funzionare il mio PhoneGap web app sul http://0.0.0.0:8000 ($ python -m SimpleHTTPServer), e in esecuzione la mia applicazione Rails in webrick su http://0.0.0.0:3000 ($ guide del server).

Il problema si verifica quando si tenta di creare un nuovo "spot" in Backbone come questo (console js cromo):

> 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. 

Ecco il mio controller di applicazione:

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

Ho letto numerosi articoli, e il più lontano lungo ho potuto ottenere è stato quando si modifica il mio routes.rb per includere questo:

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

E nella mia 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 

Aggiunta del percorso e il metodo 'cor' consentirà poi me fare salva, ma, avrò lo stesso errore quando l'eliminazione di record.

Ho un'idea di base di CORS, non riesco ad accedere a un server con un dominio diverso da quello dell'origine della mia richiesta. Ma come impostare esattamente questo con Rails, Backbone, PhoneGap, non è chiaro per me. Qualsiasi aiuto sarebbe fantastico, grazie!

+0

+1 per 'match '* all' => 'application # cor',: constraints => {: method => 'OPTIONS'}' – user2503775

risposta

2

Ho seguito this article (sezione "CORS in Rails") e funziona per me.

Sostituire if request.method == :options in if request.method == 'OPTIONS' e aggiungere metodi PUT, DELETE a headers['Access-Control-Allow-Methods']. Insted di '*' in Access-Control-Allow-Origin Ho localhost: 8080 (sto eseguendo la mia app su nginx).

Spero che questo possa essere d'aiuto.

PD: sono presenti filtri (agganci) nel controller dell'applicazione?

+0

+1 per l'articolo – MurifoX