Ruby on rails 拒绝从'执行脚本;URL';因为它的MIME类型(';application/json';)是不可执行的,并且启用了严格的MIME类型检查

Ruby on rails 拒绝从'执行脚本;URL';因为它的MIME类型(';application/json';)是不可执行的,并且启用了严格的MIME类型检查,ruby-on-rails,cors,mime-types,Ruby On Rails,Cors,Mime Types,我知道这个问题已经被问过很多次了,但以我的情况来说。Firefox正在运行,但chrome给了我以下错误: 拒绝从执行脚本'http://localhost:3000/get_all_test_centers?callback=undefined&_=1409807050144'因为它的MIME类型('application/json')不可执行,并且启用了严格的MIME类型检查。 我有一个wordpress网站,从那里我向rails服务器发送一个REST调用(jsonp请求)。我对RAILS中

我知道这个问题已经被问过很多次了,但以我的情况来说。Firefox正在运行,但chrome给了我以下错误:

拒绝从执行脚本'http://localhost:3000/get_all_test_centers?callback=undefined&_=1409807050144'因为它的MIME类型('application/json')不可执行,并且启用了严格的MIME类型检查。

我有一个wordpress网站,从那里我向rails服务器发送一个REST调用(jsonp请求)。我对RAILS中的CORS做了以下更改

mime\u类型.rb

before_filter :set_access_control_headers
def set_access_control_headers
    headers['Access-Control-Allow-Origin'] = Rails.application.secrets.website_url
    headers['Access-Control-Request-Method'] = 'GET, OPTIONS, HEAD'
    headers['Access-Control-Allow-Headers'] = 'x-requested-with,Content-Type, Authorization'
  end
Mime::Type.register'application/json',:js

应用程序\u控制器.rb

before_filter :set_access_control_headers
def set_access_control_headers
    headers['Access-Control-Allow-Origin'] = Rails.application.secrets.website_url
    headers['Access-Control-Request-Method'] = 'GET, OPTIONS, HEAD'
    headers['Access-Control-Allow-Headers'] = 'x-requested-with,Content-Type, Authorization'
  end
Rails.application.secrets.website\u url
值为
http://localhost/

控制器输出:

def get_all_test_centers
test_centers = TestCenter.all
respond_to do |format|
  format.js do
    render :json => test_centers, :callback => 'renderTestCenters'
  end
end
end
我的wordpress JS:

var renderTestCenters = function(data) {
    console.log(data);
};

$.ajax({
    url: "http://localhost:3000/get_all_test_centers",
    crossDomain: true,
    type: "GET",
    dataType: "JSONP",
    jsonpCallback: renderTestCenters
});

它在firefox中运行良好,但在chrome中它会给我带来错误

所以我终于得到了答案

更改ajax请求调用

$.ajax({
    type: "GET",
    url: "http://localhost:3000/get_all_test_centers",
    crossDomain: true,
    xhrFields: {
        withCredentials: true
    },
    success: function(data) {
        console.log(data);
    }
});
应用程序\u controller.rb

before_filter :cor
def cor
if request.headers["HTTP_ORIGIN"]
  headers['Access-Control-Allow-Origin'] = Rails.application.secrets.website_url
  headers['Access-Control-Expose-Headers'] = 'ETag'
  headers['Access-Control-Allow-Methods'] = 'GET, POST, PATCH, PUT, DELETE, OPTIONS, HEAD'
  headers['Access-Control-Allow-Headers'] = '*,x-requested-with,Content-Type,If-Modified-Since,If-None-Match,Auth-User-Token'
  headers['Access-Control-Max-Age'] = '86400'
  headers['Access-Control-Allow-Credentials'] = 'true'
end
end
最后在我的控制器中:

def get_all_test_centers
test_centers = TestCenter.all
respond_to do |format|
  format.js do
    render :json => test_centers
  end
end
end

现在,上述更改在所有浏览器中都起作用

有时结果不是由脚本直接处理的,因此为这些情况提供了:callback选项

呈现json:test\u centers,:callback=>params[:callback]

这对我有用