微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-在Rails 3,jQuery中通过轮询进行Ajax部分刷新

Rails 3,JRuby

我最近参加了jQuery中的速成课程,其中包括一些Ajax部分渲染.这让我开始思考,我是否可以使用它通过setInterval()轮询Rails服务器,每隔x秒不断刷新页面的特定部分?

我遇到的问题是如何使用$.get()方法获取部分的网址并使用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>

这看起来很不对劲,到目前为止,仅在10秒后将我的_microposts部分消隐了(所以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.erb文件,名为“ polling.js.erb”,该文件将刷新全局Feed部分.

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

我需要在micropost控制器中编写一个与上述javascript相对应的方法,这实际上提供了刷新部分代码所需的信息.它基本上是micropost控制器中index方法的简化版本,避免执行我想刷新的部分代码不需要的其他代码.

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

然后,我修改了JavaScript代码,因为我想每5秒调用一次轮询方法,以加载特定于我的Web应用程序current_user的信息.

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

最后,我更新了route.rb文件,以允许Web浏览器使用get请求调用我的轮询方法,而不会引起路由错误.我正在使用成员do块,因为该请求通过请求传递了current_user ID.

resources :microposts do
    member do
        post :polling
    end
end

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐