如何设置客户端AJAX轮询

时间:2011-12-30 07:08:39

标签: jquery ajax ruby-on-rails-3 json

我已经击败了我的头,直到它变得柔软。是时候咨询专家了!

我的应用程序产生了许多Delayed :: Jobs。我想向用户提供有关这些作业运行状态的可视反馈。假设我有一份工作< ActiveRecord :: Base模型,具有名称,状态(IDLE,QUEUED,RUNNING,SUCCEEDED,FAILED)和状态字符串,并且状态和状态通常是异步更新的。

还假设视图模板带有<div id='job-status'></div>元素作为显示作业状态的位置。哦,还假设我正在使用Rails3和jQuery。

为了获得最大的可移植性,我想使用javascript启动的客户端轮询。我知道一些javascript(jQuery方法,setTimeout等),但我没有找到Rails和jQuery函数的混合以合理的方式做到这一点。

简洁地说,如果您有一个名称,状态和状态的ActiveRecord作业模型,您将在CONTROL / jobs_controller.rb中放置什么以及将实现哪些views / jobs /?服务器是否生成html或JSON或XML来更新#job-status div? (我意识到这是一个广泛的问题 - 我不期待一个完整的答案,只是足够的指针将它拼凑在一起。)

感谢。

1 个答案:

答案 0 :(得分:2)

你应该通过jquery对你控制器上发送回数据的json启用方法进行ajax调用。

使用该数据,您可以通过$("#somediv").html(ajax_result)

等方法更新div元素的内容

这是一个真实的样本:

var linkHtml = $("#searchNumber").html();
$("#message").empty();
var aurl = "/Prospect/SearchNumberAuth?number=" + $("#MSISDN").val() ;
$.ajax({
    dataType: 'json',
    type: "GET",
    url: aurl,
    async: false,
    contentType: "application/json; charset=utf-8",
    beforeSend: function() {
        $("#holdNumber").fadeOut("slow");
        $("#searchNumber").empty().html("<image src='../../Content/images/jquery-ui/load-indicator.gif'/>");
    },
    success: function(response) {
        $("#message").fadeIn(1500).html(function() {
            if (response[0] == "Exist") {
                $("#holdNumber").fadeIn("slow");
                $("#MSISDN").attr("readonly", "readonly");
                $("#searchNumber").fadeOut("slow");
                return existMsg;
            } else if (response[0] == "Sold") {
                $("#searchNumber").empty().html(linkHtml).fadeIn("slow");
                return soldMsg;
            } else if (response[0] == "Hold") {
                $("#searchNumber").empty().html(linkHtml).fadeIn("slow");
                return holdMsg;
            } else
                $("#searchNumber").empty().html(linkHtml).fadeIn("slow");
            return notExistsMsg;
        });
    },
    error: function(jqXHR, textStatus, errorThrown) {
        $("#searchNumber").empty().html(linkHtml).fadeIn("slow");
    },
    complete: function() {
    }
});

这是控制器类中的服务器端代码,可以轻松移植到Rails:

    public JsonResult SearchNumberAuth(long number)
    {
        return this._searchNumber(number);
    }

_searchNumebr方法中,我将返回JsonResult

您可以在website中查看更多详细信息,尽管它位于波斯语中,但您可以在ProspectView.js中看到FireBug的js代码,在第二个标签中看到结果。