2015-04-20 11 views
16

Sto per tirare fuori i miei capelli ... Ho cercato di abilitare CORS in questa app Rails sin dal mattino e non funziona. Ho provato this, usando Rack Cors Gem, this answer e questo post tutto senza successo.Come abilitare CORS in Rails 4 App

Qualcuno può indicarmi la giusta direzione?

Ecco la mia JS:

 var req = new XMLHttpRequest(); 

     if ('withCredentials' in req) { 
      // req.open('GET', "https://api.github.com/users/mralexgray/repos", true); 
      req.open('GET', "http://www.postcoder.lc/postcodes/" + value, true); 
      // Just like regular ol' XHR 
      req.onreadystatechange = function() { 
       if (req.readyState === 4) { 
        if (req.status >= 200 && req.status < 400) { 
         // JSON.parse(req.responseText) etc. 
         console.log(req.responseText); 
        } else { 
         // Handle error case 
        } 
       } 
      }; 
      req.send(); 
     } 

Quando provo questo URL (da un client esterno): https://api.github.com/users/mralexgray/repos che funziona bene, sto assumendo il problema è con il mio Rails API. Ho sbagliato?

EDIT: Attualmente ho questo nel mio controller:

skip_before_filter :verify_authenticity_token 
before_filter :cors_preflight_check 
after_filter :cors_set_access_control_headers 

# For all responses in this controller, return the CORS access control headers. 
def cors_set_access_control_headers 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
    headers['Access-Control-Max-Age'] = "1728000" 
end 

# If this is a preflight OPTIONS request, then short-circuit the 
# request, return only the necessary headers and return an empty 
# text/plain. 

def cors_preflight_check 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
    headers['Access-Control-Allow-Headers'] = 'X-Requested-With, X-Prototype-Version' 
    headers['Access-Control-Max-Age'] = '1728000' 
end 
+0

ho provato e non ha funzionato. Ho persino usato l'app di esempio e ancora senza fortuna – WagnerMatosUK

+1

hai mai funzionato? Ho un front-end angolare che effettua la chiamata e ho provato anche tutte le soluzioni. La gemma del corsetto del rack non funziona per me. –

risposta

31

si dovrebbe usare rack cors

Esso fornisce un bel DSL, da utilizzare nel config/application.rb, al posto del lavoro intestazione disordinato e prima dei filtri.

Un molto permissivo sarebbe il seguente, ma naturalmente, dovrete adattarlo un po '.

use Rack::Cors do 
    allow do 
    origins '*' 
    resource '*', headers: :any, methods: :any 
    end 
end 
+0

Intendi 'config/application.rb'? – WagnerMatosUK

+0

Non so cosa "non ha funzionato" significa :) Lo uso nella mia app e va bene. Hai qualche informazione in più? – apneadiving

+0

Ok, ora funziona su Chrome. Penso che il problema fosse il tipo di permessi. È interessante notare che non funziona su FF né Safari. Immagino che non abbia niente a che fare con Rails ma con il lato JS di questo? – WagnerMatosUK

9

aggiungere al vostro Gemfile:

gem 'rack-cors' 

Aggiungi sottostante Codice a config/application.rb

# Rails 3/4 
config.middleware.insert_before 0, "Rack::Cors" do 
    allow do 
    origins '*' 
    resource '*', :headers => :any, :methods => :any 
    end 
end