【问题标题】:Rails using a background process app call back to trigger an eventRails 使用后台进程应用回调来触发事件
【发布时间】:2014-11-22 00:34:17
【问题描述】:

我有一个应用程序,它使用 SuckerPunch gem 和 Carrierwave Backgrounder 在 Rails 应用程序的背景中上传和处理图像。因此,当用户创建 Asset 模型的实例时,在处理图像时,Asset 模型中有一个属性attachment_processing? 设置为 true。我使用此视图模板向用户表明这一点

-if instance.send(base_name)
  .form-row
    - if instance.send(base_name).attachment_processing?
      .image_processing
        %span Processing Asset #{proccessing_asset_name(instance.send(base_name))}
        = image_tag("ajax-loader.gif")
    - else    
       = nice_asset(instance.send(base_name),options[:thumb])

当资产完成处理后,该属性设置为 false,并且图像在页面刷新后显示。查看服务器日志,它会在完成处理后自动启动。

Started GET "/assets/ajax-loader.gif" for 127.0.0.1 at 2014-11-21 16:10:38 +0000
   (0.2ms)  BEGIN
  SQL (0.4ms)  UPDATE `assets` SET `attachment_processing` = 0, `updated_at` = '2014-11-21 16:11:14' WHERE `assets`.`id` = 6362
   (1.9ms)  COMMIT

有没有办法,通过 ajax 或其他方法,使用它来自动显示完成的图像? 我只是在寻找一种对用户更友好的方法,而不是要求用户刷新页面或类似的东西?

非常感谢

【问题讨论】:

  • 是的,我建议你去 websocket! socket.io 可以借助 redis pubsub 解决这个问题。

标签: jquery ruby-on-rails ruby ajax


【解决方案1】:

最简单的方法是每隔几秒将页面设置为auto refresh,这样无论是否有更新,页面都会完全刷新:

<head>
  <meta http-equiv="refresh" content="30">
</head>

如果您想要更多技巧,您可能需要使用 ajax 轮询服务器,并在需要时使用 javascript 刷新页面(或页面的相关部分):

<script>
  $(document).ready(function(){
    setInterval(updateSeats,30000);
 });
  function updateSeats(){
    $.ajax({
    url:  "/flights/<%= @flight.id %>/seats",
    type: "GET",
  }).done(function(data){
    $("#seats").html(data);
  });
  }
</script>

根据手头的用例,您还可以考虑实施更精细的类似推送的方案,例如 long polling

【讨论】:

  • 他似乎在寻求事件驱动的解决方案!
  • @Rubyrider - 他想要服务器和客户端之间的事件驱动解决方案。由于 Web 服务器无法向客户端发送推送消息,因此需要实现轮询解决方案来模拟它......它可以像周期性刷新页面一样粗略,也可以像长轮询实现那样复杂
  • 是的,这个用例的实现会很复杂。
猜你喜欢
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多