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

时间:2013-08-30 17:36:47

标签: ruby-on-rails ruby rack cors

我想在我的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时,机架真正处于堆栈顶部 但它仍然只是根本不起作用。我一直得到同样的错误。任何人,请帮忙。

6 个答案:

答案 0 :(得分:17)

我遇到了与heroku相同的问题。我发现this blog有同样的机架问题。

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

答案 1 :(得分:10)

heroku解决方案有一个新的issue主题

而不是使用

config.middleware.use Rack::Cors do

尝试

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

这对我有用。

答案 2 :(得分:2)

我必须创建一个特殊的路线来处理选项请求,cors gem并没有像我预期的那样为我做这件事。我添加到routes.rb末尾的路线是:

Posts::with(['replies' => function($query) {
          $query->orderBy('id');
}])->find($pin_id);

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

#gemfile.rb

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相匹配。

我希望这会有所帮助。

在有帮助的情况下将此答案赞为有用,或在答案下方评论以进一步说明。