Rails reagiert mit 404 auf CORS Preflight Options Request
Bin ich erstellen eine Reihe von Diensten mit Schienen 4, die ich aufwändig mit einem JavaScript-browser-Anwendung. Cross-origin WIRD funktionieren, aber meine Beiträge sind nicht die preflight-OPTIONEN überprüfen, mit einem 404-Fehler. Mindestens, ich denke, das ist, was passiert. Hier sind die Fehler, wie Sie in der Konsole angezeigt. Dies ist Chrome 31.0.1650.63 auf einem Mac.
OPTIONS http://localhost:3000/confessor_requests 404 (Not Found) jquery-1.10.2.js:8706
OPTIONS http://localhost:3000/confessor_requests No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. jquery-1.10.2.js:8706
XMLHttpRequest cannot load http://localhost:3000/confessor_requests. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. main.html:1
Ich habe gesucht hoch und niedrig für Anweisungen zum aktivieren CORS, und ich bin ratlos. Die übliche Empfehlung scheint zu sein, etwas zu setzen, wie dies in der Anwendung-controller, was ich auch Tat.
before_filter :cors_preflight_check
after_filter :cors_set_access_control_headers
def cors_set_access_control_headers
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Allow-Methods'] = 'POST, PUT, GET, OPTIONS'
headers['Access-Control-Allow-Headers'] = '*'
headers['Access-Control-Max-Age'] = "1728000"
end
def cors_preflight_check
if request.method == :options
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Allow-Methods'] = 'POST, PUT, GET, OPTIONS'
headers['Access-Control-Allow-Headers'] = '*'
headers['Access-Control-Max-Age'] = '1728000'
render :text => '', :content_type => 'text/plain'
end
end
Gefolgt von einige Art der route in der Routen.rb, leitet diese Aktion, wenn Sie eine OPTIONS-Anfrage kommt.
match "/*all" => "application#cors_preflight_check", :constraints => { :method => "OPTIONS" }
Den 'match' - Direktive funktioniert nicht mehr in den Schienen 4, also habe ich daran rumgebastelt, versucht, dass es BEITRÄGE direkt, wie diese:
post "/*all" => "application#cors_preflight_check", :constraints => { :method => :options }
Aber es funktioniert immer noch nicht. Da die GET-requests zu arbeiten, gehe ich davon aus, dass das, was ich bin fehlt, ist die richtige route für die OPTIONS-Anfrage. Aber, ich habe versucht, jeden Weg, den ich denken kann, und nichts scheint zu lassen, die Anfrage durch.
Ich habe auch versucht, die Installation von cyu/rack-cors, und das gibt das gleiche Ergebnis.
Weiss jemand was ich falsch mache?
match
sollte immer noch funktionieren, aber es beschwert sich, wenn Sie sich nicht über eine über
option. Sie tun es mit post
ist definitiv nicht zur Arbeit gehen. Als jemand, der genau diesen Fehler, bevor Sie mit rack-cors
, auch werde ich Fragen: hast du den server neu starten, nachdem Sie den - rack-cors
- middleware? Ich verbrachte eine Stunde+ jagen, eine Weile wieder selbst. 🙂 ActiveRecord::RecordNotFound
- Ausnahme ausgelöst. In diesem Fall CORS funktioniert nicht. InformationsquelleAutor der Frage Rolandus | 2013-12-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Lösung mit der rack-cors gem, die Sie sagte, Sie versucht. Wie andere erwähnt haben, die Sie nicht geben viel detail in Bezug auf die front-end-framework, die Sie verwenden und wie der Antrag aussieht. Also Folgendes kann nicht gelten, aber ich hoffe, es hilft jemand.
In meinem Fall, die gem funktionierte gut, bis ich verwendet, PUT (oder PATCH oder LÖSCHEN).
Wenn Sie sich in Ihrem browser die Entwickler-Konsole, Blick auf die request-Header, und Sie haben sollte eine Zeile wie diese:
Die wichtige Sache zu beachten ist, dass die
methods
Sie anresource
sind für dieAccess-Control-Request-Method
, nicht die Request-Methode, der ist zu kommen, nach dem pre-flight-check.Hinweis, wie ich
:methods => [:get, :post, :options, :delete, :put, :patch]
dass alle Methoden, die ich kümmern.Somit deine gesamte config-Abschnitt sollte wie folgt Aussehen, für
development.rb
:InformationsquelleAutor der Antwort Tyler Collier
Working on Rails 3.2.11.
Legte ich
in meiner Strecken.rb-Datei. Der Schlüssel war, um es als top-Priorität (auf der Oberseite der Routen.rb-Datei). Erstellt, dass die Aktion so, dass es öffentlich zur Verfügung:
Und einen filter in der Anwendung-controller:
InformationsquelleAutor der Antwort ancajic
Ja, wie andere haben darauf hingewiesen, es ist ein JUWEL, vielleicht tun dies besser. Da ich aber sehr mochte die Methode zeigte in der original blog post mit dem cors-code, den ich gefunden habe der Schienen 4 Lösung, wenn Sie mit diesem code.
Ihre Routen.rb:
In Ihrem my_method_name controller:
Wie lange Sie haben, plus Ihre anderen code:
Dann sollten Sie eingestellt werden, für schiene 4.
InformationsquelleAutor der Antwort Nicholas Blasgen
Vielleicht das wesentliche, die Ihnen helfen können: CORS in Rails 4 APIs
Er fügt hinzu, die
OPTIONS
Methode, um die route, und fügt einen filter, um die API-Basis-controller, die direkt reagiert aufOPTIONS
Anfragen mit dem richtigen header und setzt die richtigen CORS-Header für alle anderen Aktionen auch.InformationsquelleAutor der Antwort dhoelzgen
Lief in dieses Problem mit den Schienen 4 und zu Entwickeln. Ich landete mit
Rack CORS middleware
gem von Calvin Yu. Ein tolles kostenloses blog Artikel.InformationsquelleAutor der Antwort Tom Doe
Ich bin mir nicht sicher, was javascript front-end framework, die Sie verwenden (oder wenn Sie), da Sie nicht näher auf was du tust auf der client-Seite zu verbinden, um Ihre Rails 4 API, aber ich dachte, ich würde hinzufügen, meine Antwort, falls es hilft niemanden.
Lief ich in genau das gleiche problem beim herstellen einer Verbindung zu einer Rails-4 API mit dem Entwickeln Juwel von einem AngularJS Frontend (beide liefen auf separaten localhost-ports). Ich habe versucht ein Login in das Backend über eine POST-Anforderung aus einer AngularJS form, aber ich habe immer eine 404-NICHT GEFUNDEN "- Fehler, weil ich das senden war eine OPTIONS-Anfrage mit "preflight". Es dauerte mehr als 2 Tage, um herauszufinden, wie das problem zu lösen.
Grundsätzlich müssen Sie einen proxy-server für front-end - (Angular, Backbone, was auch immer), um die Verbindung zu Ihrem API, so dass Ihre front-end-denkt, dass die Anforderung mit der gleichen Herkunft. Es gibt einige einfache Lösungen gibt für das einrichten von Proxies mit GruntJS. Ich bin mit Schlucken für mein Projekt mit Gulp-Verbindung und proxy-middleware mit den folgenden Einstellungen (basierend auf der Lösung gefunden hier):
Ich hoffe, das jemand hilft!
InformationsquelleAutor der Antwort po3t
Ich lief in das gleiche Problem, und bin derzeit auf der Auswertung der folgenden Strecken für jede mögliche Sicherheit /performance-Probleme. Sie lösen das Problem, aber...
Trotz "match" angeblich nicht arbeiten in Rails 4, anscheinend ist es hat funktionieren, wenn man es beschränken auf eine bestimmte Methode.
InformationsquelleAutor der Antwort RonLugge