2011-09-01 157 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'});