2010-09-26 33 views
10

好的,rails 3新的開發者在這裏。在rails應用程序中輸出jSON

我想讓我的jquery能夠從rails 3應用程序中獲取json對象。這是我的控制器。

def yourprojects 
    @projects = Projects.all(current_user) 

    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render :json => @projects } 
    end 
end 

我加入了format.json線... jQuery中我有:

$.ajax({url: '/projects/yourprojects', dataType: 'json'}); 

所以這應該工作我想。相反,服務器返回:「缺少模板」「缺少模板,,, {:locale => [:en,:en],::handlers => [:rjs,:rhtml,:builder,:rxml,: erb],:formats => [:html]} in view paths「

你需要一個jsOn返回模板嗎?不應該rails 3應用程序知道如何格式化json?

routes文件:

resources :projects do 
    collection do 
     get 'yourprojects' 
    end 
end 

回答

6

可以爲真正的REST的Accept: application/json頭,也可以將格式添加到URL快速兩輪牛車:

$.ajax({url: '/projects/yourprojects.json', dataType: 'json'}); 
+0

真棒 - 而且工作!哇,謝謝。我無法在Google上找到這個地方!我喜歡使用接受的想法,現在我在我的JS文件的頂部($ .ajaxSetup({'beforeSend':function(xhr){xhr.setRequestHeader(「Accept」,「text/javascript」)) }}))....問題是一些Ajax請求,我需要一個.js響應。其他人我想要JSON。處理這個問題的智能方法是什麼?謝謝! – WozPoz 2010-09-26 18:59:31

0
:formats=>[:html] 

,說服務器認爲被請求html。嘗試添加一個.json到你的路徑(和可能的路線),這將強制格式。爲了使這將需要一個路線是這樣的:

map.your_projects '/projects/yourprojects.:format', 
    :controller => 'projects', 
    :action => 'yourprojects' 

不知何故,好歹,在params[:format]應該"json"這個請求,以便格式處理程序可以做正確的事。

+0

感謝Squeegy,但是這是爲Rails 3?我的配置/路線看起來像這樣容納(也添加到上面的問題):資源:項目做 收集做 得到'yourprojects' 結束 結束 – WozPoz 2010-09-26 17:24:20

+0

另外,我認爲Rails 3足夠聰明,以確定請求類型和服務正確的迴應,也就是說爲什麼你可以有很多不同類型的響應類型(html,js,json,xml)? – WozPoz 2010-09-26 17:25:41

+0

我實際上有點落後,不確定Rails 3的路線如何工作。但2.x像我描述的那樣工作。抱歉! – 2010-09-26 17:31:04

5

這不是Rails的的問題,而是AJAX/jQuery的不發送Accept頭: 試試這個:

$.ajax({ 
    url: 'url_to_action', dataType: "json", 
    beforeSend : function(xhr){ 
     xhr.setRequestHeader("Accept", "application/json") 
    }, 
    success : function(data){ 
     //.. do something with data 
    }, 
    error: function(objAJAXRequest, strError, errorThrown){ 
     alert("ERROR: " + strError); 
    } 
    } 
); 

如果你所有的AJAX請求期望JSON,那麼你就可以在全局設置標題:

$.ajaxSetup({ 
    dataType: 'json', 
    'beforeSend' : function(xhr){ 
    xhr.setRequestHeader("Accept", "application/json") 
    } 
}); 

其他選項將添加.json到路徑或data:{format: 'json'}$.ajax選項的散列。 Rails默認支持格式路徑後綴resoures路由。只需嘗試rake routes即可查看。

相關問題