我可以在rails中延迟HTTP响应吗?

时间:2014-08-11 05:39:21

标签: ruby-on-rails ruby

我是Rails 4中的新手。我想延迟HTTP响应。

我认为' respond_to'方法可以响应HTTP请求。

然而,当我删除了“回复”时。方法,rails控制器自动响应请求。

以下是我的步骤。

  1. 在视图中发送HTTP请求

    [index.html.erb]
    <script>
    var ready = function() {
        alert('this is function');
    }
    var aquery = function() {
        $.ajax({
            type : "POST",
            url : "app/subaction",
        });
    }
    
    $(document).on('ready page:load', aquery); 
    </script>
    
  2. 在Controller中接收HTTP请求

    class AppController < ApplicationController
       def subaction
         (Nothing here...)
       end
    end
    
  3. subaction.js.erb

    $('#div_id').empty().append("Complete response ...");
    
  4. 在此步骤中,尽管没有&#34; respond_to&#34;方法

    我可以延迟回复???你能解释一下rails中的请求 - 响应操作吗?

    谢谢...

1 个答案:

答案 0 :(得分:1)

Rails默认呈现响应的主要原因是because the documentation says so。 Rails遵循“约定优于配置”的理念,这意味着它会尝试以最小的方式帮助您保持编写的代码。大多数情况下,您希望控制器操作呈现视图,因此Rails会为您执行此操作。

您可以使用多种技术来延迟响应。最简单的方法是使用Ruby's sleep method来引入延迟:

class AppController < ApplicationController
   def subaction
     sleep 3 # Wait for 3 seconds before responding
   end
end

在测试应用程序在慢速Internet连接上的行为方式时,这可能很有用,但在生产代码中应该避免使用。快速应用程序让用户满意。

您还可以使用Rails 4.0.2中引入的the ActionController::Live module。它允许您将数据流式传输到客户端,但使用流可能很棘手。 jQuery在触发回调之前等待响应完成,因此您必须use something else来处理流。

这类似于Websockets,一种新兴的流媒体标准。 Rails中有some support available for websockets,但浏览器并不普遍支持它。


另一种选择是将延迟切换到前端。您可以使用JavaScript的setTimeoutsetInterval在延迟后调用一些代码:

setTimeout(function() { 
    alert("I run once, after 4 seconds");
}, 4000);
setInterval(function() { 
    alert("I run every two seconds");
}, 2000);

如果您尝试检查更新,可能会尝试使用setInterval,但您可能会发现使用setTimeout安排一次性检查更加灵活服务器。然后,您可以在服务器中包含一个时间延迟,指定再次询问之前等待的时间。