2015-06-01 27 views
0

我有一個javascript文件,其中包含一些ajax,如下所示。我的ajax調用如何知道我的json在rails中的位置

$.ajax({ 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     url: 'data', 
     dataType: 'json', 
     success: function (data) { 
      draw(data); 
     }, 
     error: function (result) { 
      error(); 
     } 
    }); 

我也已經在呈現json的控制器中創建了一個方法。

類GraphController < ApplicationController的 高清指數 結束

def data 
    render :json => User.select('value').map(&:value) 
end 
end 

所以我的問題是,如何軌知道那裏的JSON是從特別是我沒有從我的控制器返回一個物理文件來了。如果我的文件夾結構中還有物理.json文件,會發生什麼情況?是否有一個視圖如何查找json文件(例如物理文件> jbuilder文件>控制器操作)?

+0

在你的情況下輸出'User.select('value')。map(&:value)'是以json格式傳遞的,你不會找到任何.json文件。 –

+0

通過指定render:json => User.select('value')。map(&:value)rails將自動傳遞json格式的響應。如果你想以特定的格式構建你的json響應,那麼你可以使用jbuilder。 –

+0

如果Rails位於'public'中,它只會提供'.json'文件(或任何靜態文件)。 – max

回答

1

in ajax call .. contentType: "application/json; charset=utf-8",定義了您使用導軌查詢的請求類型。 What that says is, "if the client wants HTML in response to this action, just respond as we would have before, but if the client wants XML, return them the list of people in XML format." (Rails determines the desired response format from the HTTP Accept header submitted by the client.)

看看respond_to api軌如何響應不同類型的請求-js/XML/HTML/JSON

這樣你就可以在你的控制器試試這個well..edit這樣並嘗試數據動作..所有對js/html/xml/json等數據的調用都可以工作,rails會理解它需要發送什麼類型的響應。

def data 

     format.html { redirect_to(user_list_url) } 
     format.js 
     format.xml { render :xml => @users.to_xml(:include => @accounts) } 
     format.json {render :json => User.select('value').map(&:value) } 
end 

呈現來自控制器的任何錯誤view..can就像這樣: -

if @user.present? 
     format.json {render :json => User.select('value').map(&:value) } 
    else 
     format.js { render :json => @user.errors.full_messages.join(' '), 
:status => 400 } 
    end 

鑑於此使用ajax.error功能這樣

.error(function(data) { 
        $("#show_error").html("An Error Occurred,Please try again."); 
        }); 

希望這幫助

+0

這很好。感謝Milind。那麼如果我想要返回jbuilder json(它看起來像一個更靈活的方式返回json –

+0

@ SebastianZeki ..我編輯了我的答案...如果它可以幫助你,請把它標記爲正確:) – Milind

2

每個動作都必須渲染一些東西。 要麼你明確地渲染一些東西,要麼rails會查找一個名稱類似於視圖內相應控制器文件夾內的動作的頁面。 您可以從視圖中呈現html.erb,.json,.haml等(如果您指定了響應格式)

如果您在顯式渲染someting(在您的情況下,爲json),Rails不會爲打擾查看視圖文件夾。

或者,您可以跳過render :json聲明並在.json文件中指定該對象,並回應:json。

這裏在你的場景中,你正在渲染一個json對象,這將被接受在AJAX函數數據爭論的success:部分。

+0

好了,但然後a)我如何在顯示的ajax中引用它?我是否將它稱爲動作名稱,如url:'data'和b)如果我在jbuilder中創建json,那麼我將控制器動作留空,然後如何在ajax調用中引用該動作?困惑..... –

+0

第一個問題:在URL中,你可以鍵入'圖形/數據''控制器/動作',並且不要忘記在路徑中定義它。 第二個問題:有兩件事情,如果從行動本身進行顯式渲染,那麼我認爲不需要jbuilder,但是如果該對象足夠大,那麼jbuilder是一個不錯的選擇。這http://railscasts.com/episodes/320-jbuilder?view=asciicast將幫助你。 –

+0

謝謝Karan。我看過那個視頻,但是它沒有提到的一件事是如何從ajax調用jbuilder json。我怎麼稱呼它?我仍然使用url:data,但確保jbuilder文件與數據視圖位於同一個文件夾中(並將其稱爲data.json.jbuilder)? –

相關問題