3

Heroku でホストする Rails Restful サービスと、ローカル マシンから実行しようとしている Angular クライアントを構築しました。最終的に、このクライアントは phonegap プロジェクトに追加されて実行されます。ただし、今のところ、アプリケーションを chrome でテストしており、ブラウザが以下のエラーを返し続けています。

XMLHttpRequest cannot load  Origin http://localhost is not allowed by Access-Control-Allow-Origin. 

これは私が得るエラーメッセージです。Heroku にプッシュする前にこの問題に直面し、応答にアクセス ヘッダーを追加することで解決しました。

    after_filter :cors_set_access_control_headers

# For all responses in this controller, return the CORS access control headers.

def cors_set_access_control_headers
        headers['Access-Control-Allow-Origin'] = 'http://localhost' #*
        headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
        headers['Access-Control-Allow-Headers'] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(',')
        headers['Access-Control-Max-Age'] = "1728000"
end

これはうまくいかないようです。何らかの理由で、これは Heroku では機能しません。この問題を解決する方法を知っている人はいますか?

4

3 に答える 3

6

Rails 4 で考えられる解決策の 1 つ (以前のバージョンはチェックしていません)。以前rails-apiはスタンドアロンの API サーバーを作成していました。したがって、例に基づいていActionController::APIます。を使用する場合、同じソリューションが正常に機能する必要がありActionController::Baseます。

# app/controllers/application_controller.rb
class ApplicationController < ActionController::API
  include ActionController::ImplicitRender
  include ActionController::MimeResponds

  def cors_preflight_check
    headers['Access-Control-Max-Age'] = '1728000'

    render json: {} # Render as you need
  end
end


# config/application.rb
class Application < Rails::Application
  config.action_dispatch.default_headers = {
    'Access-Control-Allow-Origin' => '*',
    'Access-Control-Allow-Methods' => 'POST, PUT, PATCH, DELETE, GET, OPTIONS',
    'Access-Control-Request-Method' => '*',
    'Access-Control-Allow-Headers' => 'Origin, X-Requested-With, Content-Type, Accept, Authorization'
  }
end


# config/routes.rb
# Last route definition code line
match '*path', to: 'application#cors_preflight_check', via: [:options]

この解決策は、私にとってはそれほどハックではないようです。OPTIONSまた、 「Rails-way」のHTTPメソッドにも配慮しています。

于 2013-12-10T13:57:58.633 に答える
2
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :cors_preflight_check
after_filter :cors_set_access_control_headers

# For all responses in this controller, return the CORS 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'] = %w{Origin Accept Content-Type X-Requested-With auth_token X-CSRF-Token}.join(',')
    headers['Access-Control-Max-Age'] = "1728000"
end

def cors_preflight_check
  if request.method == "OPTIONS"
    headers['Access-Control-Allow-Origin'] = 'http://localhost'
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
    headers['Access-Control-Allow-Headers'] = %w{Origin Accept Content-Type X-Requested-With auth_token X-CSRF-Token}.join(',')
    headers['Access-Control-Max-Age'] = '1728000'
    render :text => '', :content_type => 'text/plain'
  end
end
end

それはトリックを行うように見えました。

于 2013-12-10T00:19:47.890 に答える
0

私はrails-apiを使用していますが、このソリューションは私にとってはうまくいきます

https://til.hashrocket.com/posts/4d7f12b213-rails-5-api-and-cors

注: オリジン「localhost:4200」をオリジン「*」に変更してください

于 2017-05-08T03:29:27.200 に答える