2013-09-22 38 views
5

我有一個在Heroku中運行的Rails應用程序,以及一個使用Jquery Mobile的html文件。在Access-Control-Allow-Origin中遇到問題

Rails應用程序返回JSON數據(使用RABL),我的移動應用程序應該拿起並顯示。

這就是我正在做的,我正在給列表視圖提供響應的內容。很簡單。如果我使用Chrome,則控制檯將顯示錯誤訪問控制 - 允許來源不允許原始空值。如果我嘗試使用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"}] 

我對訪問控制允許來源讀了一段時間了,但我不知道我必須做的,我應該改變我的服務器中的東西嗎?我正在瀏覽器上試用這個html文件,但它在我的手機上也無法正常工作。 當mobileinit運行時,我已將$.support.cors$.mobile.allowCrossDomainPages = true;設置爲true。

任何有關下一步該怎麼做的信息,將不勝感激。

編輯:如果您正在使用RABL,請記住在初始化程序中將變量enable_json_callback設置爲true。你必須從雙方啓用這個東西。

回答

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" 
+0

感謝響應。我應該在哪裏調用這個函數? – Sebastialonso

+0

它應該是您在ajax調用中調用的action的'after_filter'。如果有幾個對rails應用程序的ajax調用,那麼這可以在'application_controller'中用作'after_filter'。 – Nerve

+0

有關基於環境設置此方法的信息,請參閱https://stackoverflow.com/a/17815546/912563 – lightswitch05

18

在導軌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