web-dev-qa-db-ja.com

Railsアプリケーションでラックコアを機能させることができません

私はRailsアプリケーションにCORSを実装したかったので、グーグルで rack-cors gemを使用しました。そして、READMEで述べられているように、Gemfileを更新しました。それに応じてapplication.rbを次のように更新しました:

module YourApp
  class Application < Rails::Application

    # ...

    config.middleware.use Rack::Cors do
      allow do
        origins '*'
        resource '*', :headers => :any, :methods => [:get, :post, :options]
      end
    end

  end
end

しかし、それはうまくいきませんでした。何をしても、ブラウザコンソールで次のメッセージが表示され続けます。
XMLHttpRequest cannot load https://somewebsite.com. Origin http://0.0.0.0:3000 is not allowed by Access-Control-Allow-Origin.

Githubでこの blogpost および issue を読んだ後、ミドルウェアスタック内のrack-corsミドルウェアの位置が重要であることに気付きました。だから私はgithubの問題で言われたようにした:

module YourApp
  class Application < Rails::Application

    # ...

    config.middleware.insert 0, Rack::Cors do
      allow do
        origins '*'
        resource '*', :headers => :any, :methods => [:get, :post, :options]
      end
    end

  end
end

その後、rake middlewareを実行すると、rack-corsはスタックの一番上にあります。
しかし、それでもまだ機能しません。同じエラーが発生し続けます。誰でも助けてください。

24
Prostakov

Herokuで同じ問題に遭遇しました。私は このブログ を同じrack-corsの問題で見つけました。

use Rack::Corsconfig.ruに移動し、herokuに再デプロイすると動作します。

require ::File.expand_path('../config/environment',  __FILE__)
run Rails.application

require 'rack/cors'
use Rack::Cors do

  # allow all origins in development
  allow do
    origins '*'
    resource '*', 
        :headers => :any, 
        :methods => [:get, :post, :delete, :put, :options]
  end
end
19
dcunited001

Herokuソリューション用の新しい issue スレッドがあります

使用する代わりに

config.middleware.use Rack::Cors do

試す

config.middleware.insert_before ActionDispatch::Static, Rack::Cors do

それでうまくいきました。

10
farofeiro

私はオプションのリクエストを処理するために特別なルートを作成する必要がありましたが、cors gemは期待どおりにそれを行いませんでした。 routes.rbの最後に追加したルートは次のとおりです。

  match "*path", :to => proc {|env| [200, {
  'Access-Control-Allow-Origin' => '*',
  'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS',
  'Access-Control-Allow-Credentials' => 'true',
  'Access-Control-Request-Method' => '*',
  'Access-Control-Allow-Headers' => 'Origin, X-Requested-With, Content-Type, Accept, Authorization',
'Content-Type' => 'text/plain'

 }, ["CORS Preflight"]] }, :via => [:options]
2
TomDunning

これが私の修正方法です:

GemfileでRack CORS gemのコメントを外すか(存在する場合)、または追加するだけです。

gem 'rack-cors'

次に、以下のコードを実行してgemをインストールします。

bundle install

以下のコードをconfig/application.rb of your Rails application。たとえば、これにより、GET、POST、または任意のリソース上の任意のOriginからのOPTIONSリクエストが許可されます。

module YourApp
  class Application < Rails::Application
    # ...

    # For Rails 5 Appications

    config.middleware.insert_before 0, Rack::Cors do
      allow do
        origins '*'
        resource '*', headers: :any, methods: [:get, :post, :options]
      end
    end

    # For Rails 3/4 Applications

    config.middleware.insert_before 0, "Rack::Cors" do
      allow do
        origins '*'
        resource '*', headers: :any, methods: [:get, :post, :options]
      end
    end
  end
end

オリジンを「*」に設定しても問題ありませんが、本番環境にデプロイする場合は、セキュリティ上の理由から、この値をフロントエンドのURIと一致するように変更する必要があることに注意してください。

注: Railsを実行している場合は、config/application.rbで十分です。 config.ruも更新する必要はありません。

それで全部です

これが役に立てば幸いです。

1
Promise Preston

結局のところ、このgemにはherokuにいくつかの問題があることが判明しました。ローカルマシンでは、このgemは完全に正常に動作します。

0
Prostakov

追加またはコメント解除したことを確認してくださいgem 'rack-cors' Gemfile内

0
andreofthecape