使用 jQuery/JavaScript 将变量传递给 Rails 中的 Ruby on Rails

Using jQuery/JavaScript to pass variables to Ruby on Rails, within Rails

本文关键字:Rails 中的 Ruby on jQuery JavaScript 变量 使用      更新时间:2023-09-26
使用

Ruby on Rails,并在需要时使用 jQuery/JavaScript。 当我需要收集信息并将其传递回 Rails 时,我在 JS 方面遇到了一个特别的问题。 此时,我使用 POST 发送信息。 一个例子是:

  $('#moveslotsbutton').on('click', function () {
    var source = 'lots';
    var rows = [];
    var rowi = -1;
    $.each(moveslotstable.rows('.active').data(), function (i, val) {
      $(rowi = rowi + 1, rows[rowi] = val[0])
    });
    $.post('/moves_update',
        {
          commit: 'Moves Lots',
          source: source,
          active: rows
        }
    );
    return false;
  });

在这里,我需要收集一系列信息以发送到"活动"的Rails。 这允许用户从表中选择多行,并使用"活动"数组以及一些解释性标量提交它进行处理。

这里的问题似乎是Rails并不真正知道发生了什么,因此无法在逻辑上做出响应。 实际上,呈现器的功能是返回 HTML 状态 200,但屏幕在任何情况下都不会更新。 为了得到响应,我需要返回JS,如下所示:

  def update
    commit = params[:commit]
    case commit
      when "Moves Lots"
        lots = params[:active]
        @rows = Array.new
        lots.each { |lot| @rows = @rows + Lot.lot_rows(lot) }
        render js: "window.location.assign(location.origin + '/moves_indexrows')"
      else
        flash[:alert] = "Invalid request: #{commit}"
        result = [false, "Processing Error"]
    end
  end

然后,这会使用操作"索引行"触发控制器"移动"。 但是,由于我要回到 JS,因此它不知道@rows,因此无法在以下视图中使用它。 (操作索引行最初是索引的一部分,我只是把它拉出来以更好地理解它。

我看过使用 JS submit((,这会让它保持在 Rails 中,但它不会传递所需的变量? 有没有办法做我正在尝试做的事情,这意味着创建JS变量并将其传递给Rails,并让Rails控制该过程? 我错过了什么吗? 谢谢。

你可以

这样做,

    $('#moveslotsbutton').on('click', function () {
        var source = 'lots';
        var rows = [];
        var rowi = -1;
        $.each(moveslotstable.rows('.active').data(), function (i, val) {
          $(rowi = rowi + 1, rows[rowi] = val[0])
        });
        //changing $.post to $.ajax and then handling the response in success callback.
        $.ajax({
          url: '/moves_update',
          method: 'post',
          data:{
              commit: 'Moves Lots',
              source: source,
              active: rows
            },
         success: function(data){
          //the response 'data' contains rows within it
          window.location.assign(location.origin + '/moves_indexrows');
         }
        });
        return false;
      });

在控制器中:

def update
    commit = params[:commit]
    case commit
      when "Moves Lots"
        lots = params[:active]
        @rows = Array.new
        lots.each { |lot| @rows = @rows + Lot.lot_rows(lot) }
        # rendering @rows in json
        render text:@rows.to_json
      else
        flash[:alert] = "Invalid request: #{commit}"
        result = [false, "Processing Error"]
    end
  end