Rails 3, JRuby
我最近参加了一个jQuery速成班,其中包括一些ajax部分呈现。这让我想到,我可以用它来轮询Rails服务器使用setInterval()
,每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()
方法的url是什么?
谢谢,
希望这将帮助任何人谁想要使用ajax刷新部分-特别是如果你是一个初学者按照Michael Hartl的教程学习Ruby on Rails。我是这样解决我的问题的。
首先,我创建了一个单独的.js。微博视图文件夹中名为poll .js的Erb文件。Erb’,它将刷新全局提要部分。
$('#gf').html("<%= escape_javascript render :partial =>
'microposts/micropost', :locals => {:microposts => @mps} %>");
我需要在微帖子控制器中编写一个与上述javascript相对应的方法—这实际上提供了刷新部分所需的信息。它基本上是我在微帖子控制器中的index方法的简化版本,避免了执行我想要刷新的部分不需要的额外代码。
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);
});
最后,我更新了我的路线。Rb文件允许web浏览器调用我的轮询方法,使用get请求,而不会导致路由错误。我使用member do
块,因为请求通过请求传递current_user id。
resources :microposts do
member do
post :polling
end
end