无法让机架在轨道应用中工作

问题描述 投票:22回答:6

我想在我的rails应用程序中实现CORS,所以我用Google搜索了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上阅读这篇blogpostissue后,我意识到中间件堆栈中的机架中间件的位置可能很重要。所以我按照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真的处于堆栈的顶端。 但它仍然只是根本不起作用。我一直得到同样的错误。任何人,请帮忙。

ruby-on-rails ruby rack cors
6个回答
17
投票

我和heroku遇到了同样的问题。我发现this blog有相同的rack-cors问题。

刚刚将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

10
投票

heroku解决方案有一个新的issue线程

而不是使用

config.middleware.use Rack::Cors do

尝试

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

这对我有用。


2
投票

我不得不创建一个特殊的路线来处理选项请求,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]

1
投票

您只需要在Gemfile中取消注释Rack CORS gem(gemfile.rb)

#Jingle

gem 'rack-cors'

然后运行下面的代码来安装gem

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。

我希望这有帮助。

如果有帮助,请将此答案视为有用,或在答案下方进行评论以获得更多说明。


0
投票

毕竟它出现了这个宝石与heroku有一些问题,在本地机器上它完全正常。


0
投票

确保在Gemfile中添加或取消注释gem 'rack-cors'

© www.soinside.com 2019 - 2024. All rights reserved.