Не удается получить стойку, работающую в режиме рельсов

Я хотел реализовать CORS в моем приложении rails, поэтому я искал goggog для rack-cors. И я сделал все, что было сказано в 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.

После прочтения этого blogpost и issue на github я понял, что, возможно, промежуточное ПО 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, стойки-корсы действительно находятся в верхней части стека.
Но это все равно просто не сработает. Я продолжаю получать ту же ошибку. Кто-нибудь, пожалуйста, помогите.

Ответ 1

Я столкнулся с той же проблемой с герокой. Я нашел этот блог с той же проблемой стойки.

Просто переместил use Rack::Cors в config.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

Ответ 2

Существует новая issue нить для решения heroku

Вместо использования

config.middleware.use Rack::Cors do

попробуйте

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

Это сработало для меня.

Ответ 3

Мне пришлось создать специальный маршрут для обработки запросов опций, драгоценный камень cors не сделал это для меня, как я ожидал. Маршрут, который я добавил в конец маршрутов. 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]

Ответ 4

Вам просто нужно откомментировать гем Rack CORS в вашем Gemfile (gemfile.rb)

# gemfile.rb

gem 'rack-cors'

А затем запустите код ниже, чтобы установить гем

bundle install

А также убедитесь, что ваш инициализатор cors (cors.rb) установлен следующим образом # config/initializers/cors.rb

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

Установка исходных текстов на "*" должна быть приемлемой для разработки, но имейте в виду, что при развертывании в рабочей среде вы захотите изменить это значение в соответствии с URI внешнего интерфейса по соображениям безопасности.

Все это

Надеюсь, это поможет.

Ответ 5

В конце концов выяснилось, что этот камень имеет некоторые проблемы с герокой, на локальном компьютере он отлично работает.

Ответ 6

Убедитесь, что вы добавили или раскомментировали gem 'rack-cors' в Gemfile