1

我需要更新我的 index.html.erb 文件(用于产品),但无需重新加载整个页面。例如,我有一个名为“Sold”的列,它的值为“YES”或“NO”。我有一个更新这些值的后台 rake 任务,但我希望我的索引文件更新为,向用户显示哪些产品已售出。我不知道如何从 rake 任务中调用这种更改。请问有什么帮助吗?我看到的大多数 ajax 和 rails 3“教程”主要处理用户到服务器的交互,而不是服务器到用户的交互。

4

2 回答 2

1

获取服务器更新的方法有很多。

  • 轮询(setTimeout 每隔一段时间发出一个 ajax 请求)
  • 长轮询(facebook 使用什么)
  • Comet(阻止请求,在定期注入 javascript 时不让它完成,类似于长轮询)
  • WebSockets(html5 的东西)
  • Flash/Java 小程序等

通常一个简单的轮询——每隔这么多秒就可以完成这项工作。-> ( asciicast )

是不同方法的比较。

于 2012-08-28T12:14:32.643 回答
0

您可能会在您的产品索引页面上添加 javascript 代码来 ping 您的服务器以定期(每 n 秒)获取产品的状态。如果您的页面上有很多产品,这可能是一个昂贵的电话。所以我会在你的身上有这样的东西index.html.erb

<script type="text/javascript">
  $('document').ready(function() {
    $.ajax({
      method: 'get',
      url : 'products/ping',
      dataType : 'json',
      success: function (json) {
        // iterate through json objects and update their respective sold status
        // on page.
      }
    });
</script>

然后将 ping 路由添加到您的产品控制器,该控制器基本上以 JSON 对象响应,其中包含您要在视图上更新的产品的状态和 id。因此,当 Ajax 请求完成并获得 JSON 对象时,迭代产品并根据其 id 更新该产品的状态。因此,您对产品控制器的操作将如下所示:

# app/controllers/products_controller.rb
def ping
  respond_to do |format|
    products_sold_statuses = {}
    format.json do
      Products.all.each do |product|
        # add product sold status and probably id to products_sold_statuses
      end
      render :json => product_sold_statuses, :layout => false
    end
  end
end

该代码未经测试,因此只需将其用作构建解决方案的基础。它还假设您使用的是 JQuery。

于 2012-08-28T12:15:57.090 回答