2011-06-10 55 views
0

我試圖呈現一個JSON字符串以響應要求如下列:軌JSON格式

def check_progress 
    if request.xhr? 
    render :json=>"{'bytes_expected': #{session[:size]}, 'bytes_recieved': #{session[:size]}, 'last_seq': 0}".to_json 
    end 
end 

,但在我的js代碼:

$.getScript('contacts/check_progress', function(data){ 
    console.log(data.bytes_recieved) 
    console.log(data.bytes_expected) 
    d.renderProgress(data); 
}); 

我響應data.bytes_recieved得到了一個未定義和data.bytes_expected

我的rails代碼有什麼問題?

回答

2

我認爲你的主要問題可能是你返回的字符串看起來像json,實際上並不是一個json散列。

在你的render語句中,你手工將json格式化爲一個字符串......這是很好的,直到你調用to_json爲止。

to_json可能會傳遞一個散列而不是字符串。

你可以嘗試在你的渲染語句結尾去掉.to_json:

render :json=>"{'bytes_expected': #{session[:size]}, 'bytes_recieved': #{session[:size]}, 'last_seq': 0}" 

或創建Ruby哈希然後將其轉換成JSON:

@ruby_hash = { 
    :bytes_expected => session[:size], 
    :bytes_recieved => session[:size], 
    :last_seq => 0 
} 

render :json=> @ruby_hash.to_json 
0

jQuery的$.getScript方法將<script>節點插入HTML文檔的<head>

使用該方法,瀏覽器將不會將X-Requested-With HTTP標頭髮送到服務器。因爲它將是一個簡單的HTTP請求而不是AJAX。而您的瀏覽器正在等待響應中的一個JavaScript而不是JSON數據。

$.getScript方法的jQuery的文檔是有點誤導,因爲它說的方法簽名的回調函數data,但它不會給你在回調函數中的任何數據,因爲您的瀏覽器簡單地執行JavaScript的有這個請求沒有實際的有效載荷。

有可能的解決方案:

  • 如果你需要加載的跨域數據,然後嘗試刪除request.xhr?條件的使用JSONP方法和回調
  • 如果它不是一個跨域的情況下,簡單地用一個$.getJSON響應加載和不接觸的情況

更新:我還沒有看到它,但@Barlow指出它鷗如你所說,你需要在你的Rails應用中修復你的json代碼。

0

您可以簡化代碼:

def check_progress 
    if request.xhr? 
    render :json => {'bytes_expected' => session[:size], 
        'bytes_recieved' => session[:size], 
        'last_seq' => 0} 
    end 
end 

as render :json將做哈希轉換爲JSON對象爲喲ü。我不知道這是否能解決問題。