2015-09-04 98 views
2

Rails 3中,JRuby的Ajax的局部刷新通过查询Rails 3中,jQuery的

我最近参加了在jQuery的快速速成班,其中包括一点ajax的部分呈现的。这让我想到了,我是否可以使用这个来轮询使用setInterval()的Rails服务器,每隔x秒不断刷新我的页面的特定部分?

我遇到的问题是我如何使用$.get()方法来抓取部分的url并使用load()重新加载它。这是混乱开始的地方 - 使用Rails 3,我有一个名为“_microposts”的部分,在一个div中用'id =“gf”'(gf表示全局提要)呈现。这发生在我的Rails应用主页上,所以这种情况下的url将是“// localhost:8080/home”,而不是部分的url。

这是我最初的JavaScript/jQuery的

<script> 
    $(document).ready(function() {  
     setInterval(function (e) { 
      var url = $.get("<%= escape_javascript render :partial => 
       'microposts/micropost', :locals => {:microposts => @microposts }%>"); 

      $('#gf').html('loading...').load(url);   
     },10000); 
    }); 
</script> 

这看起来不对,到目前为止,只是清空了我的_microposts 10秒后的部分(所以setInterval的工作,并且它肯定更新正确的区域,只用一个空格)

编辑: 关于我的问题的思考,我意识到,这是类似于更新部分从事件,如单击按钮或东西。唯一真正的区别是应该触发这个setInterval()函数的“事件”。所以,我的修订jQuery代码如下:

<script> 
    $(document).ready(function() { 
     setInterval(function (e) { 
      $('#gf').html("<%= escape_javascript render :partial => 
       'microposts/micropost', :locals => {:microposts => @microposts } %>")}, 
      10000); 
    }); 
</script> 

不幸的是,现在,似乎没有任何可以从用户的角度来看发生,但服务器出每10秒一个Ajax请求。

那么为什么我不能使用ajax轮询更新,并将更改应用到我的_microposts部分? $.get是否在这种情况下使用正确的功能?尝试重新加载部分时,load()方法的网址是什么?

感谢,

回答

2

希望这将有助于任何人谁愿意使用ajax-特别是如果你跟随迈克尔·哈特尔的教程来学习Ruby on Rails的初学者刷新的部分。以下是我如何解决我的问题。

首先,我在micropost视图文件夹中创建了一个单独的.js.erb文件,名为'polling.js.erb',它将刷新全局提要部分。

$('#gf').html("<%= escape_javascript render :partial => 
          'microposts/micropost', :locals => {:microposts => @mps} %>"); 

我需要写在微柱控制器将与上述Javascript成为这基本上提供给刷新部分所需的信息对应的方法。它基本上是micropost控制器中我的索引方法的简化版本,并避免执行不需要的部分我想刷新的附加代码。

def polling 
    @mps = Micropost.all #add some paginate code if you wish 
    @micropost = current_user.microposts.build(params[:micropost])     
end 

我再修改我的javascript代码,我想叫轮询方法,每5秒,加载具体到我的webapp的CURRENT_USER的信息。

$(document).ready(function() { 
    setInterval(function() { 
      $.ajax('microposts/<%= current_user.id %>/polling'); 
    } , 5000);   
}); 

最后,我更新了我的routes.rb文件,允许网页浏览器打电话给我投票的方法,使用GET请求,而不会导致路由错误。我正在使用member do块,因为请求正通过请求传递current_user id。

resources :microposts do 
    member do 
     post :polling 
    end 
end