Ruby on Rails - AJAX 请求不起作用(跨域),尝试了一切
Posted
技术标签:
【中文标题】Ruby on Rails - AJAX 请求不起作用(跨域),尝试了一切【英文标题】:Ruby on Rails - AJAX request not working (cross-origin), tried everything 【发布时间】:2015-09-23 16:30:57 【问题描述】:(抱歉英语不好) 我尝试执行 ajax 请求,但由于同源策略而无法正常工作。我的应用程序尚未部署,我使用 Ruby on Rails 3.2.3 和 Unicorn 服务器。
AJAX 请求位于资产 javascript 文件中,我在视图中调用它。当我尝试从 AJAX 请求中获取数据时,控制台说 “跨域请求被阻止:同源策略不允许读取 [url] 处的远程资源。这可以通过将资源移动到同一域或启用 CORS 来解决。”
我什么都试过了:
在ajax请求中使用jsonp:console.log说语法错误 使用 rack cors,使自述文件 (https://github.com/cyu/rack-cors) 中所说的一切,但它不起作用,控制台中的消息仍然相同(是否重新启动服务器) 尝试一些关于 rack-cors 的语法,在我能找到的堆栈溢出的每篇文章中都提到,我试过这个:应用程序.rb:
config.middleware.insert_before ActionDispatch::Static, Rack::Cors do
allow do
origins '*'
resource '*', :headers => :any, :methods => [:get, :post, :options], expose: :location
end
但它不起作用,我在 config.ru 中尝试了这个
use Rack::Cors do
# allow all origins in development
allow do
origins 'localhost:3000'
resource '*',
:headers => :any,
:methods => [:get, :post, :delete, :put, :options]
end
end
我用 "origins 'localhost:3000'" 和 "origins '*'" 尝试了这段代码,但它们都不起作用,我没有忘记 "require 'rack/cors'"
我很绝望,你能帮帮我吗?
【问题讨论】:
你用的是什么浏览器? Chrome 会在内部阻止此类行为。在你的 bash $open -a Google\ Chrome --args --disable-web-security 中运行将关闭此功能。 我用的是firefox,但应用程序也需要在chrome中运行。 我要问:你修改你的application.rb文件后是否重启了你的rails服务器? 是的,每次更改后我都会重新启动 如果您仍然需要这方面的帮助,请尝试确保方法数组中包含所有 HTTP 动词。如果这仍然不起作用,请发布您的控制器代码。你可能需要skip_before_filter :verify_authenticity_token
。如果这不起作用,请检查您的路线和命名空间。
【参考方案1】:
我们遇到过类似的情况,使用 rack-cors
解决了
基因文件:
gem 'rack-cors', :require => 'rack/cors'
应用程序.rb:
config.middleware.insert_before 0, "Rack::Cors" do
allow do
origins '*'
resource '*', :headers => :any, :methods => [:get, :post, :options]
end
end
别忘了重启你的 Rails 服务器!
编辑:
我突然想到,如果您将应用服务器也用作 Web 服务器,这只会在生产中工作。如果您使用 nginx 或 Apache 作为您的 Web 服务器,那么您的静态资产将由它提供。您必须在 Nginx/Apache 上启用 CORS。
【讨论】:
所以这就是为什么它对我不起作用!我已经使用 rack-cors (完全相同的代码),但我怎样才能让它在开发模式下工作? 我只是测试它,即使在生产模式下它仍然无法正常工作 =/【参考方案2】:几乎毫无疑问,您没有定义正确的标头以允许访问。以下演练应该可以帮助您:
http://dotnet-concept.com/Tip/2015/3/5798824/Cross-Origin-Request-Blocked-The-Same-Origin-Policy-disallows-reading-the-remote-resource-This-can-be-fixed-by-moving-the-resource-to-the-same-domain-or-enabling-CORS-
【讨论】:
我设置了与教程中描述的相同的标题,没有任何改变以上是关于Ruby on Rails - AJAX 请求不起作用(跨域),尝试了一切的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on rails - 更新 ajax 的 PUT 方法
jquery .ajax 对 ruby on rails 服务器的 post 请求在客户端出现 JSON.parse 错误
Ruby on Rails,json vs js ajax 响应