5

我有一个在 Heroku 中运行的 Rails 应用程序,以及一个使用 Jquery Mobile 的 html 文件。

Rails 应用程序返回 JSON 数据(使用 RABL),我的移动应用程序应该会提取并显示这些数据。

这就是我正在做的事情,我正在将响应的内容提供给列表视图。很简单。如果我使用 Chrome,控制台会显示错误Origin null is not allowed by Access-Control-Allow-Origin。如果我在 Firefox 上尝试,控制台上没有错误,但也没有显示数据,甚至没有触发警报。

function getBuses(){
  $('#content').append("<ul id='bus_list' data-role='listview' data-inset='true'</ul>")
  $('#content').trigger("create");
  //Se llama a la API para retornar todos los buses
  $.getJSON('http://someapp.herokuapp.com/buses.json', function(data)
  {
    $.each(data, function(key, value)
      { 
        alert(key + ":" + value);
        $('#bus_list').append('<li id="'+bus.id+'">'+bus.numero_de_linea+'<li/>');
      });
    });
  $('#bus_list').listview("refresh");
}

这是服务器响应的内容:

[{"id":7,"numero_de_linea":"604"}]

我已经在 Access-Control-Allow-Origin 上阅读了一段时间,但我不确定我必须做什么,我应该更改服务器中的某些内容吗?我正在我的浏览器上尝试这个 html 文件,但它也不能在我的手机上运行。运行时我已将$.support.corsand设置$.mobile.allowCrossDomainPages = true;为 true mobileinit

任何有关下一步做什么的信息,将不胜感激。

编辑:如果您正在使用 RABL,请记住在初始化程序中将变量 enable_json_callback 设置为 true。你必须从双方启用这个东西。

4

2 回答 2

18

在 Rails 4 中,该命令after_filter已更改为,after_action因此控制器顶部的完成代码应为:

 after_action :set_access_control_headers

 def set_access_control_headers
   headers['Access-Control-Allow-Origin'] = "*"
   headers['Access-Control-Request-Method'] = %w{GET POST OPTIONS}.join(",")
 end
于 2014-04-10T19:56:57.417 回答
12

服务器响应非常好,但执行此检查的是浏览器。要允许您的 JSON 请求,您必须在发送响应时设置访问标头,如after_filter.

# This is used to allow the cross origin POST requests made by confroom kiosk app.
  def set_access_control_headers
    headers['Access-Control-Allow-Origin'] = "*"
    headers['Access-Control-Request-Method'] = %w{GET POST OPTIONS}.join(",")
  end

这里*允许所有域。这应该更改以匹配您的域。例如:

headers['Access-Control-Allow-Origin'] = "http://localhost:3000"
于 2013-09-22T18:57:01.623 回答