javascript - Ruby on rails - 如何让 Controller 与 ajax 同时执行 2 个 Action ?

标签 javascript ruby-on-rails ruby ajax controller

我在开发环境中使用 ajax 为同一个 Controller 调用两个不同的操作。 在一个操作中,我正在以非常缓慢的过程更新数据库。 在另一个操作中,我想获得更新进度条的百分比。 我可以看到两者都在执行, 问题是第二个 Action 正在等待第一个 Action 完成以执行它自己并且它应该每秒执行一次以获得实际的百分比。 Rails 可以并行执行两个 Action 吗?还是 Webrick 问题?


我按照建议尝试了 puma 但它仍在等待第一个 Action , 这是 ajax 代码调用

$(document).ready(function() {
$(':button').click(function(){
    var formData = new FormData($('form')[0]);
    $.ajax({
        url: '/quotes/upload',  //Server script to process data
        type: 'POST',
        //Ajax events
        beforeSend: progress,
        success: completeHandler,
        error: function(ts) { alert(ts.responseText) },
        // Form data
        data: formData,
        //Options to tell jQuery not to process data or worry about content-type.
        cache: false,
        contentType: false,
        processData: false
    });
});
});

function progress() {
$.ajax({
    url: '/quotes/status.json',
    dataType: "JSON"
}).success(function (percentual) {
    if (percentual >= '95') {
        location.reload();
    } else {
        var $bar = $('.bar');
        $bar.width(percentual+"%");
        setInterval(progress,800);
    }
});
}

这是控制台打印出来的:

Started GET "/quotes/status.json" for 127.0.0.1 at 2014-09-21 10:23:38 -0300
Processing by QuotesController#status as JSON

 percentual => 0 Completed 200 OK in 4ms (Views: 0.6ms | ActiveRecord: 0.0ms)


Started POST "/quotes/upload" for 127.0.0.1 at 2014-09-21 10:23:38 -0300
Processing by QuotesController#upload as */*
Parameters: {"quotes"=>#<ActionDispatch::Http::UploadedFile:0x00000001b980b0    @tempfile=#<Tempfile:/tmp/RackMultipart20140921-5849-otvxky>, @original_filename="HIST_XXX.TXT", @content_type="text/plain", @headers="Content-Disposition: form-data; name=\"quotes\"; filename=\"HIST_XXX.TXT\"\r\nContent-Type: text/plain\r\n">}
  Rendered quotes/index.html.erb within layouts/application (0.7ms)
 Completed 200 OK in 10456ms (Views: 170.3ms | ActiveRecord: 0.0ms)


Started GET "/quotes/status.json" for 127.0.0.1 at 2014-09-21 10:23:49 -0300
Processing by QuotesController#status as JSON

 percentual => 100 Completed 200 OK in 3ms (Views: 0.4ms | ActiveRecord: 0.0ms)

正如我在控制台看到的那样,它只是在上传之前进行第一次调用,然后进行上传,然后在完成后进行第二次状态调用

最佳答案

您是对的 - Webrick 一次只会处理一个请求。也许给Thin , PumaUnicorn去吧——他们都处理并发请求。

注意:请注意,使用 SQLite 可能会遇到类似的并发问题(尤其是涉及写入时!)切换到 PostgeSQL 或 MySQL。


使用Thin :

gem 文件

gem 'thin'

当然...

bundle install

然后启动服务器

thin start

使用Puma :

gem 文件

gem 'puma'

当然...

bundle install

启动服务器

rails s puma

使用Unicorn :

gem 文件

gem 'unicorn'

当然...

bundle install

启动服务器

unicorn_rails

关于javascript - Ruby on rails - 如何让 Controller 与 ajax 同时执行 2 个 Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25954744/

相关文章:

javascript - 无法在 node.js 中显示行数

ruby-on-rails - ActiveRecord :inverse_of does not work on has_many :through on the join model on create

ruby-on-rails - Searchkick/Elasticsearch-根映射定义具有不受支持的参数

ruby-on-rails - 更改 `require` 以连接 Ruby 文件是聪明还是疯狂?

javascript - 从 Scala.js 访问 JS this

javascript - Handlebars.js - 在每个循环、if 语句和子对象中获取父上下文

javascript - 单击控制台中的显示元素后

ruby-on-rails - 只查询组内最大值的记录

ruby-on-rails - Gems 会减慢 Rails 测试启动速度,我可以有选择地禁用它们吗?

启动应用程序时 Ruby 崩溃。是环境吗?