2013-08-30 13 views
20

Ich wollte CORS in meiner Schienen-Anwendung zu implementieren, so googelte ich rack-cors Juwel für sie. Und ich tat alles, wie in README gesagt wurde, dass aktualisiert Gemfile entsprechend und application.rb wie folgt aktualisiert:
Kann nicht Rack-Cors arbeiten in Schienen Anwendung

module YourApp 
    class Application < Rails::Application 

    # ... 

    config.middleware.use Rack::Cors do 
     allow do 
     origins '*' 
     resource '*', :headers => :any, :methods => [:get, :post, :options] 
     end 
    end 

    end 
end 

Aber es hat nicht funktioniert. Egal, was ich tat, in der Browserkonsole ich immer Nachricht gehalten:
XMLHttpRequest cannot load https://somewebsite.com. Origin http://0.0.0.0:3000 is not allowed by Access-Control-Allow-Origin.

Nach diesen blogpost und issue auf Github zu lesen, erkannte ich, dass vielleicht Position der Rack-cors Middleware in den Middleware-Stack Angelegenheiten. Also tat ich, wie in der Github Frage gesagt wurde:

module YourApp 
    class Application < Rails::Application 

    # ... 

    config.middleware.insert 0, Rack::Cors do 
     allow do 
     origins '*' 
     resource '*', :headers => :any, :methods => [:get, :post, :options] 
     end 
    end 

    end 
end 

Danach, wenn ich rake middleware Rack-cors laufen ist wirklich an der Spitze des Stapels.
Aber es wird immer noch einfach nicht funktionieren. Ich bekomme immer den gleichen Fehler. Jeder, bitte helfen Sie.

+0

ich es offensichtlich wissen, aber haben Sie sicherstellen, dass die Schienen-Server neu zu starten? Da dies Teil der Initialisierung ist, wird es erst nach einem Neustart wirksam. – clexmond

+0

Ja, ich habe den Server viele Male neu gestartet. – Prostakov

+0

Das Problem ist, dass es nichts Übernatürliches ist, nur um dieses Juwel zum Laufen zu bringen. Nur mich verrückt zu fahren ... – Prostakov

Antwort

15

Ich stieß auf das gleiche Problem mit Heroku. Ich habe this blog mit der gleichen Rack-Cors Ausgabe gefunden.

Nur verschoben use Rack::Cors zu config.ru, umhergestellt zu Heroku und es funktioniert.

require ::File.expand_path('../config/environment', __FILE__) 
run Rails.application 

require 'rack/cors' 
use Rack::Cors do 

    # allow all origins in development 
    allow do 
    origins '*' 
    resource '*', 
     :headers => :any, 
     :methods => [:get, :post, :delete, :put, :options] 
    end 
end 
+0

Immer noch nicht funktioniert .. in Entwicklung .. – larryzhao

+1

Das ** DO ** arbeiten. Und ab dem 7. Juli 2014 ist das der einzige Weg **, um es zum Laufen zu bringen (oder Sie können 2/3 Stunden mit jeder Lösung verbringen, die auf Google verfügbar ist ...). thx – Ben

+0

stellen Sie sicher, dass Sie dieses 'require'-Rack/cors'' haben –

0

Immerhin kam heraus, dass dieses Juwel einige Probleme mit Heroku hat, auf dem lokalen Rechner funktioniert es vollkommen in Ordnung.

+3

Können Sie weitere Einzelheiten oder Links angeben? Hast du eine Arbeit gefunden? – Jason

10

Es gibt ein neues issue Gewinde für die Heroku Lösung

Statt mit

config.middleware.use Rack::Cors do 

versuchen

config.middleware.insert_before ActionDispatch::Static, Rack::Cors do 

die für mich gearbeitet.

+0

Dies scheint eine Sache mit der Rails-Version zu sein. Ich fand, dass ich das erste Code-Snippet in der obigen Antwort in Rails 3.2 und das zweite Snippet in Rails 4.1 verwenden musste. –

+0

Beides funktionierte für mich, Schienen 4.1. Dieser Thread ist unbezahlbar, verglichen mit den Tonnen von Mist, die über dieses Thema im Internet gefunden werden können – Ben

1

Ich musste eine spezielle Route erstellen, um die Optionen Anfragen zu behandeln, der Kors Edelstein tat es nicht für mich, wie ich es erwartet hatte. Der Weg, den ich bis zum Ende der routes.rb hinzugefügt wurde:

match "*path", :to => proc {|env| [200, { 
    'Access-Control-Allow-Origin' => '*', 
    'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS', 
    'Access-Control-Allow-Credentials' => 'true', 
    'Access-Control-Request-Method' => '*', 
    'Access-Control-Allow-Headers' => 'Origin, X-Requested-With, Content-Type, Accept, Authorization', 
'Content-Type' => 'text/plain' 

}, ["CORS Preflight"]] }, :via => [:options] 
0

Stellen Sie sicher, hinzugefügt oder uncommented gem 'rack-cors' im Gemfile

Verwandte Themen