2011-09-01 162 views
2

我想更新我的rails應用程序中的div。 Iam剛剛學習ROR。所以它是我的學習舞臺,請找到代碼。 鑑於網頁...Ruby on Rails + Ajax

<%= javascript_tag do %> 
    jQuery(function($) 
{ 

    $("#tabs4").click(function() 
    {  
     $.ajax(
     { 
     url:'/spaces/showcal', 
     type:'GET' 

     }); 
     }); 

}); 


<% end %> 

在空間控制器..

def showcal 

    respond_to do |format| 

    format.html 
    { 
     render (:update) { |page| 
     page.replace_html 'tab4', :partial => 'spaces/showcal' 
    }} 
    end 
end 

我在做什麼錯在這裏。請幫忙 我也有一個泛音頁面(_showcal),其中有一些文本顯示到該div。

+0

反正。你能告訴我爲什麼我們應該使用respond_to do | format | format.html format.js – rubyist

+1

format.html和format.js是一種響應不同響應類型的方法。也許你想渲染或返回一些有所不同,取決於預期的格式。如果你沒有respond_to塊,你的控制器動作就會變成你正在進行的渲染方法調用,因爲它每次只會執行一步。 – agmcleod

回答

0

當使用AJAX,調試這種事情的好辦法是看有什麼反應服務器返回。如果它看起來不錯,那麼你知道你的javascript代碼需要改變才能使它工作,如果它看起來不對,那麼先修復服務器端代碼。

下面是我會做:

def showcal 
    render :layout => false 
end 


#showcal.html.erb 
<%= render :partial => "spaces/showcal" %> 

你的JS塊:

jQuery(function($) 
{ 
    $("#tabs4").click(function() 
    {  
     $.ajax({ 
     url:'/spaces/showcal', 
     type:'GET', 
     success: function(data) 
     { 
      $('#tab4').html(data); 
     } 
     }); 
    }); 
}); 

我一般喜歡使用JavaScript作爲應該軌內置的代碼,當涉及到更換和使用內容與阿賈克斯。我不得不承認,正因爲如此,我不確定您的更新行爲是否基本正確。如果您使用原型助手,page.replace_html應該可以工作。唯一的原因是你正在做一個Ajax請求來實現它,並且生成的主體將包含該代碼,並且它不會在你當前的dom上執行。所以我認爲這可能是執行,但因爲它是在一個單獨的頁面響應,它沒有做任何事情。

試一試我的建議,讓我知道它是怎麼回事。對不起,我的回答有點朦朧。

+0

那麼變量數據包含什麼?它是否包含部分頁面文本_showcal?我們不需要使用respond_to | format |在控制器中檢查返回的響應的格式我很抱歉,如果我錯了,因爲我剛剛學習ROR和Jquery + ajax – rubyist

+0

該數據包含任何請求的響應。成功函數傳遞這些數據,作爲jQuery默認設置的一部分。所以在這種情況下它將包含部分。只有當您需要針對該操作以多種格式進行響應時才需要該格式。否則它只是迴應一個,並將呈現您的基於html的視圖。例如,使用腳手架控制器,在show動作中,可以只有一行'@myobject = MyModel.find(params [:id])'。格式。​​對於XML或JSON響應等內容非常有用。我主要將它用於JSON。 – agmcleod

+0

但是當我提醒數據它返回對象。在我的部分頁面中,我只有兩行文字。所以我猜如果我們嘗試提醒數據,那麼這些文本應該會返回。另外$('#tab4')。一旦用戶點擊該選項卡,html(數據)應顯示文本。但它沒有顯示文字... – rubyist

0

您應該要求/spaces/showcal.js並回應format.js

我從來沒有與$.ajax一起工作,您可能需要在那裏設置額外的參數。隨着script.aculo.us,像這樣的工作:

new Ajax.Request('/tasks/#{task.id}.js', 
    {asynchronous:true, evalScripts:true, method:'get'});