2016-05-16 28 views
0

私は自分のレールアプリにGoogleプレイスAPIを実装しようとしています。Railsクロスドメインajaxリクエスト(CORS)

これは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. 

私はラックCORSの宝石を使用していると私はこのスニペットを追加しました私の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リクエストを行います)

私のリクエストヘッダーは変更されていません。

:それは場所APIによってこれらのスレッドで書かれて

試みたすべてをサポートしていないので、

(アクセス制御 - 許可 - 起源は、ヘッダを要求するためには追加されません)

JSONPはオプションではありません

+0

何に展開していますか?これはあなたのローカル開発環境ですか?私の展開では、私のケースのnginxの設定ファイルでサーバ設定の中でヘッダを設定する必要がありました。 –

+0

私はWebrickを使用していると信じています、あなたは説明できますか? – MaxDBN

答えて

0

私は私のレールのアプリでGoogleプレイスAPIを実装しようとしています。

CORSが何をしているのか混乱しているようです。たとえばhttps://maps.googleapis.comへのajaxコールを実行しようとしている場合は、CORSヘッダーsent in the response by Googleだけが重要です。これで問題が解決しない場合は、古いapiバージョンのエンドポイントを使用しようとしている可能性があります。あなたのアプリケーションが他のドメインにデータを提供することができるようにしたい場合は、あなたがCORSヘッダを提供する https://developers.google.com/maps/documentation/javascript/examples/place-search

代わりにの手順に従ってください。しかし、別のフロントエンドで消費されるRails APIアプリケーションを実行していない限り、これはあなたの問題を引き起こしているものと似ていません。

CORSの仕組みに関するチュートリアルについてはUsing CORSを参照してください。

一方、CSP (content security policy)では、クロスドメイン要求に対してより許容されたルールを設定することができます。しかし、GoogleがCORSヘッダーをWebサービスに提供しているので、この場合は必要ありません。

+0

マップを表示せずにこのライブラリを使用できますか?結果をJSON形式で取得するだけですか?私は混乱するかもしれませんが、これは私がここの指示に従うことによって達成しようとしたものです:https://developers.google.com/places/web-service/search、私は何か間違ったことをしましたか? – MaxDBN

+0

私はキーを持っていないので、エンドポイントをテストすることはできませんが、例えば[Postman](https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop)などでリクエストを送信し、 CORSヘッダー。 Googleがまだそのエンドポイント用に追加していない可能性があります。 – max

+0

まずは感謝します。私はそれがjavascriptライブラリで動作している。私が得た問題は現在生産中です.-今、私は、クロムがジオロケーションをブロックするので、SSL証明書を追加する方法を理解する必要があります – MaxDBN

関連する問題