2014-07-18 122 views
2

您好想在我的ruby on rails教程中實現ajax,並且控制器將在處理ajax請求時返回一個對象。我不知道在我的JavaScript文件中處理響應。 我想根據javascript文件中返回的對象更新一些div。在rails上的Ajax成功回調

以下是我已經寫在我的showcomments.js.erb

$('.show_comment').bind('ajax:success', function() { 
    $(this).closest('tr')="Something here from the object returned"); 
}); 

我的鏈接,Ajax調用被稱爲是通過這行代碼

<td><%= link_to 'Show Comment', :action => 'showcomment' , :id =>article, :remote => true ,:class=>'show_comment' %></td> 

我的控制器動作,其中該請求處理是這樣的

def showcomment 
    @article = Article.find(params[:article_id]) 
    @comment = @article.comments.find(params[:id]) 
    respond_to do |format| 
     format.js{ render :nothing => true } 
    end 
end 

這怎麼辦?

回答

2

變化showcomment這樣:

def showcomment 
    @article = Article.find(params[:article_id]) 
    @comment = @article.comments.find(params[:id]) 
    respond_to { |format| format.js } 
end 

在showcomments.js.erb你可以訪問兩個對象@article@comment。 示例使用如下:

$('#yourdiv').html('<%= @article.name %>'); 
0

當您響應js格式時,您不提供任何內容。因此showcomments.js.erb中的代碼未被評估。在控制器中刪除{ render :nothing => true },並在showcomments.js.erb中做任何你想做的事情。順便說一句,你不需要ajax:success事件。已經是請求的結束了。

showcomments.js.erb

$('.show_comment').closest('tr').html("<%= # you may render partial here or whatever %>"); 
3

我只是想嘗試和擴大其他答案一點點。

在rails中,當您將:remote => true添加到鏈接時,它基本上會處理jquery ajax調用的第一部分。這就是爲什麼你不需要bind.(ajax:success, function(){ # do stuff here });

這是一個典型的jQuery Ajax調用

$.ajax({ 
    url: "test.html", 
    type: "POST" 
}).done(function() { 
    $(this).addClass("done"); 
}); 

滑軌採用第一部分的護理,直到.done回調。因此,在您的JavaScript ERB模板東西放在回調這樣

.done(function() { 
    #your showcomments.js.erb file is inserted here 
}); 

要渲染來自控制器的showcomments.js.erb模板只是這樣做

def showcomment 
    @article = Article.find(params[:article_id]) 
    @comment = @article.comments.find(params[:id]) 
    respond_to do |format| 
    format.js 
    end 
end 

你不需要任何後format.js,因爲那時默認的rails動作是呈現一個與動作同名的js模板,在這種情況下它是showcomment.js.erb

現在你知道該鏈接何時被點擊,它將直接呈現showcomment模板,並且其中的任何JavaScript都將立即運行。 Rails使得使用ajax非常簡單。我希望有所幫助。

+0

Doug,你可以有js.erb響應+解除ajax:在另一個純js文件中的成功嗎?我正在嘗試集成fullcalendar,並且我正在使用js.erb進行服務器端錯誤呈現,但會將fullcalendar代碼保留在events.js中。 –