Rails アプリに Google Places API を実装しようとしています。
これは、ajax リクエストからデータをフェッチする関数を使用しようとしたときに発生するエラーです。
XMLHttpRequest cannot load . Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.
私はrack-cors gemを使用しており、このスニペットをconfig/application.rbファイルに追加しました:
config.middleware.insert_before 0, "Rack::Cors" do
allow do
origins '*'
resource '*', :headers => :any, :methods => [:get, :post, :options]
end
end
これは私の見解(coffeescript)からのajaxリクエストです:
$.ajax
url: url
dataType: "json"
type: "GET"
この部分を application_controller に追加しました
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, 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, GET, OPTIONS'
headers['Access-Control-Allow-Headers'] = '*'
headers['Access-Control-Max-Age'] = '1728000'
render :text => '', :content_type => 'text/plain'
end
end
そして、これを私のルートファイルに
match '*path' => 'application#cors_preflight_check', :via => :options
「cors_preflight_check」メソッドがリクエストによってトリガーされないことに気付きました。(ビュー内の特定のリンクをクリックすると、AJAX 要求が行われます)
リクエストヘッダーが変更されていないことに気付きました。
(Access-Control-Allow-Origin はリクエストヘッダーに追加されません)
jsonp は、Places API でサポートされていないため、オプションではありません
これらのスレッドに書かれているすべてを試しました:
- https://github.com/cyu/rack-cors/issues/33
- Rack-cors が Rails アプリケーションで機能しない(config.middleware.insert 0, Rack::Cors do)
- https://demisx.github.io/rails-api/2014/02/18/configure-accept-headers-cors.html
- Rack-cors レール 4 で POST メソッドが機能しない(アプリ コントローラーで前後のアクションを追加する)
- Rack-cors と Grape を使用してカスタム レスポンス ヘッダーを追加します(:expose キーを使用)。