2013-09-22 25 views
5

ile ilgili sorunlar yaşıyorum Heroku'da çalışan bir Rails uygulaması ve Jquery Mobile kullanarak bir html dosyası var.Erişim Denetimi-İzin-Menşei

Raylar uygulaması benim mobil uygulama alıp gösteri varsayalım ki, (RABL kullanarak) JSON verilerini döndürür.

Bu ben liste görünümü yanıt içeriğini besliyorum, yapıyorum budur. Gayet basit. Chrome'u kullanırsam, konsol, Kökeni null değerine Erişim-Denetim-İzin-Kökeni tarafından izin verilmediğini gösterir. Firefox'ta çalışırsam konsolda bir hata yok, ancak uyarı tetikleyicileri bile veriler gösterilmiyor.

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"); 
} 

Bu sunucu yanıt şudur:

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

Ben bir süre için şimdi Access-Control-Allow-Origin okuma ettik, ama ben yapmam gerekeni emin değilim, sunucumdaki bir şeyi değiştirmeli miyim? Bu html dosyasını tarayıcımda deniyorum, fakat telefonumda da çalışmıyor. çalıştırıldığında, $.support.cors ve $.mobile.allowCrossDomainPages = true; ayarlamayı yaptım.

Bundan sonra yapılacaklar hakkında her türlü bilgi büyük takdir edilecektir.

EDIT: RABL ile çalışıyorsanız, başlatıcıda enable_json_callback değişkenini true olarak ayarlamayı unutmayın. Bu şeyi her iki taraftan da etkinleştirmelisin.

cevap

12

Sunucu mükemmel yanıt veriyor, ancak bu denetimi yapan tarayıcıdır. JSON isteğinize izin vermek için, after_filter numaralı telefondaki gibi yanıt gönderirken erişim başlıklarını ayarlamanız gerekir.

# 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 

İşte * izinleri tüm etki. Bu alan adınıza uyacak şekilde değiştirilmelidir. ör .: Raylar 4 komut after_filter yılında

headers['Access-Control-Allow-Origin'] = "http://localhost:3000" 
+0

Teşekkür yanıt için. Bu işlevi nereye çağırmalıyım? – Sebastialonso

+0

Ajax çağrınızda çağıran eylemin bir 'after_filter' olması gerekir. Raylar uygulamasına birkaç ajax çağrısı varsa, bu, 'application_controller' içinde 'after_filter' olarak kullanılabilir. – Nerve

+0

Bunu çevreye göre ayarlamak için bkz. Https://stackoverflow.com/a/17815546/912563 – lightswitch05

18

böylece denetleyici üst bitmiş kodu olmalıdır after_action olarak değiştirildi:

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