Rails antwortet mit 404 auf die Anforderung von CORS Preflight-Optionen

Ich erstelle eine Reihe von Diensten mit Rails 4, die ich mit einer JavaScript-Browseranwendung verwende. Ursprungsübergreifende GETS funktionieren einwandfrei, aber meine POSTs haben die Preflight-OPTIONEN-Prüfung mit einem 404-Fehler nicht bestanden. Zumindest denke ich, dass genau das passiert. Hier sind die Fehler, wie sie in der Konsole angezeigt werden. 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 hoch und niedrig nach Anweisungen zum Aktivieren von CORS gesucht und bin ratlos. Die übliche Empfehlung scheint zu sein, so etwas in den Application Controller zu schreiben, was ich auch getan habe.

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 einer Route in routes.rb, die zu dieser Aktion umleitet, wenn eine OPTIONS-Anfrage eingeht.

match "/*all" => "application#cors_preflight_check", :constraints => { :method => "OPTIONS" }

Die 'match'-Direktive funktioniert in Rails 4 nicht mehr, also habe ich damit herumgespielt und versucht, sie direkt mit POSTS abzugleichen:

post "/*all" => "application#cors_preflight_check", :constraints => { :method => :options }

Aber es geht immer noch nicht. Da die GET-Anfragen funktionieren, gehe ich davon aus, dass mir die richtige Route für die OPTIONS-Anfrage fehlt. Ich habe jedoch jede erdenkliche Route ausprobiert und nichts scheint die Anfrage durchzulassen.

Ich habe auch versucht zu installierencyu / rack-corsund dies ergibt das gleiche Ergebnis.

Weiß jemand was ich falsch mache?

Antworten auf die Frage(7)

Ihre Antwort auf die Frage