我對rails中的ajax請求感到困惑。Rails和ajax:關於回調的困惑
我使用ajax提交表單,一切都很好。現在,我必須處理的回調,但是......
以下一些教程提示是添加
respond_to do |format|
format.js
end
到CONTROLER#創建,然後放置在視圖文件夾中的「create.js.erb」與響應。
其他教程建議在assets文件夾中創建一個js文件並處理來自JS文件的回調。
有什麼區別?什麼是正確的方式?
我對rails中的ajax請求感到困惑。Rails和ajax:關於回調的困惑
我使用ajax提交表單,一切都很好。現在,我必須處理的回調,但是......
以下一些教程提示是添加
respond_to do |format|
format.js
end
到CONTROLER#創建,然後放置在視圖文件夾中的「create.js.erb」與響應。
其他教程建議在assets文件夾中創建一個js文件並處理來自JS文件的回調。
有什麼區別?什麼是正確的方式?
兩者都是處理Ajax請求回調的不同方式。我建議你使用js.erb文件來處理Ajax回調,因爲這個文件可以識別JS和Ruby代碼並執行。
例如,
在你的控制器,
def create
...
if something
@foo = true
else
@foo = false
end
在create.js.erb
,這是可以做到像你想顯示/隱藏一些div基於@foo
的值,你可以這樣寫,
<% if @foo %>
// do something with JS code
<% else %>
// do something else
<% end %>
雖然如果您在資產文件夾中創建JS文件,那麼您將無法像上述那樣編寫條件,因爲它是純JS文件,創建js.erb是處理ajax響應的簡單方法。
他們是兩種截然不同的方法。例如,假設您要做的只是顯示確認用戶提交的消息。如果你走的路線create.js.erb然後該文件可能看起來像
$('#message').text('<%= j @message %>')
你的Ajax請求的響應是一個JavaScript代碼,做了必要的修改UI的。 jQuery在接收到它時執行該JavaScript,並且您的JavaScript對於響應可能執行的操作沒有任何可見性。
另一種方法是讓你的控制器來渲染一些數據。這可以是描述提交結果的一些JSON,也可以是一段html。例如你的控制器可能會做
render json: {status: 'success', message: 'Thank you for your submission'}
的JavaScript使得XHR可能看起來像
$.ajax('/some_url', {dataType: 'json'}).done(function(data){
//data is the json your controller sent
$('#message').text data.message
});
,或者如果你渲染HTML
$.ajax('/some_url', {dataType: 'html'}).done(function(data){
//data is the html your controller sent
$('#message').html data
});
所以在這種情況下,它是你的JavaScript決定如何處理返回的數據。
我個人不喜歡create.js。erb路由 - 我發現它讓我的javascript更難閱讀:我無法從我的表單提交代碼中看出在這個回調中可能會發生什麼。
測試控制器是否產生需要用不同語言執行的某些內容的blob,以及如果在執行任意代碼的位置執行測試時,這很難。我更喜歡它的行爲像一個API,返回結構化數據,客戶端可以適當地採取行動(客戶端可能永遠不是一個瀏覽器,它可能是一個移動應用程序)。
所以它是一樣的權利? – 2014-09-24 09:10:50
不,他們是完全不同的,儘管一般情況下你可以達到同樣的目的 – 2014-09-24 09:14:33
這個回調應該做什麼? – 2014-09-24 07:52:30
這取決於...例如我需要清除表單輸入字段或我必須執行控制器操作。我只需要知道兩種方法之間的區別。 – 2014-09-24 07:58:33