Railsy odpowiadają 404 na żądanie opcji wstępnej weryfikacji CORS
Tworzę zestaw usług za pomocą Rails 4, które wykorzystuję w przeglądarce JavaScript. Cross-origin GETS działają poprawnie, ale moje POST zawodzą, sprawdzając opcje OPTION z inspekcją wstępną z błędem 404. Przynajmniej tak myślę. Oto błędy, które pojawiają się w konsoli. To jest Chrome 31.0.1650.63 na Macu.
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
Szukałem informacji o wysokim i niskim poziomie, aby uzyskać instrukcje dotyczące włączania CORS. Zwykle zaleca się umieszczenie czegoś takiego w kontrolerze aplikacji, co zrobiłem.
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
Następuje jakiś rodzaj trasy w route.rb, który przekieruje do tej akcji, gdy pojawi się żądanie OPTIONS.
match "/*all" => "application#cors_preflight_check", :constraints => { :method => "OPTIONS" }
Dyrektywa 'match' nie działa już w Rails 4, więc bawiłem się nią, próbując dopasować ją bezpośrednio do POSTS, tak jak poniżej:
post "/*all" => "application#cors_preflight_check", :constraints => { :method => :options }
Ale to nadal nie działa. Ponieważ żądania GET działają, zakładam, że brakuje mi właściwej trasy dla żądania OPCJE. Jednak wypróbowałem każdą trasę, o której mogę pomyśleć, i nic nie wydaje się, aby ta prośba przeszła.
Próbowałem także zainstalowaćcyu / rack-cors, a to daje ten sam rezultat.
Czy ktoś wie, co robię źle?