2

我有点菜鸟,所以请多多包涵!

我正在尝试——当用户在仪表板上登录时——让 jQuery 每 X 秒定期 ping 服务器,并使用当前日期时间更新用户的“心跳”并将“在线”设置为 true。

我可能缺少一些涉及 jQuery 和 Rails 之间通信的 RESTful 概念和概念。刚刚完成 Michael Hartl 的 Ruby on Rails 教程并正在构建他的示例应用程序。

我做过研究,但答案主要涉及填写表格;我想在没有人的情况下做到这一点。

所以我需要以某种方式将 :user_id 传递给 jQuery 并将其链接到正确的 URI。我有一个状态控制器和一个状态模型,它们属于一个用户(其中​​一个)。Heartbeat 和 Online 在状态表中。

rake routes 显示: PUT /states/:id(.:format) states#update

states_controller.rb

class StatesController < ApplicationController
  before_filter :signed_in_user, only: [:thump]
  before_filter :correct_user,   only: [:thump]

  def new
  end
  def update
    @user = User.find(params[:id])
    user.update_attributes(heartbeat: Time.now, online: true)

    respond_to do |format|
      format.js
    end
  end
end

应用程序.js

jQuery.ajaxSetup({ 
  'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
})

// Periodically updates heartbeat
$(function(){
    setInterval (thump, 3000);
    var js = '<thump> ';
    function thump(){
        console.log(js + 'Test');       
        $.ajax({
            url: 'states/update',
            type: 'POST',
            success: function(result) {
                console.log(js + result);
            }
        });
    }
});

谢谢您的帮助。

4

2 回答 2

0

如果您尝试执行的用户与当前登录的用户相同,那么您似乎不需要传递任何内容,只需在控制器中使用 current_user (或其他),而不是传递 id 和再次重新获取相同的对象。

于 2012-11-08T06:38:45.460 回答
0

为什么不将您的 .js 文件更改为如下所示:

function giveLife(url) {
    setInterval (thump, 3000);
    var js = '<thump> ';
    function thump(){
        console.log(js + 'Test');       
        $.ajax({
            url: url,
            type: 'POST',
            success: function(result) {
                console.log(js + result);
            }
        });
    }
}

并将其放在您要启动心跳的视图中:

<script type="text/javascript">
    $(function(){
         giveLife(<%= states_path(@state, @user_id).to_json %>);
    });
</script>
于 2012-11-08T06:40:28.233 回答