【问题标题】:Rails: Posting Multiple Checkbox Values To Controller On Change EventRails:在更改事件时将多个复选框值发布到控制器
【发布时间】:2024-05-17 02:20:01
【问题描述】:

我有一个包含多个对象的分页表,并且希望将它们的 ID 传递给会话变量,具体取决于在导出最终 ID 列表之前用户浏览多个页面时是否已选择存储行的复选框标记。当我单独选择每一行时,它目前正在工作,但是当我点击“全选”复选框时,只有每页上的最后一个 ID 最终被保存到会话变量中

为此,我通过更改事件传递每个 ID:

Javascript:

<script type="text/javascript">

$(function(){
    $('#selectall').click(function(i, v){
$('.css-checkbox').prop('checked', this.checked).trigger("change");
    });

var checkCount = $('.css-checkbox').length;
$('.css-checkbox').click(function(i, v){
    $('#selectall').prop('checked',$('.css-checkbox:checked').length  == checkCount)
});

$('.css-checkbox').change(function(){
$.post('user_exports/update_user_export_session', { object_id:  $(this).val(), checked: this.checked});
    });
});

</script>

更新控制器中的操作:

def update_user_export_session

  render :nothing => true

  session[:object_ids] ||= []

  if params[:checked] == "true"
      session[:object_ids] << params[:object_id]
  else
      session[:object_ids].delete(params[:object_id])
  end

end

当我单击 SelectAll 复选框时,rails 服务器显示 10 个参数被传递给控制器​​中的 update_session 方法,但 session[:object_ids] 最终只有一个 ID。

【问题讨论】:

    标签: jquery ruby-on-rails checkbox session-variables onchange


    【解决方案1】:

    我发现了问题。在触发更改事件时,虽然它被记录为发生在控制器的单独帖子中,但实际上它一次发送所有更改事件,因此控制器中的逻辑只解释最后一个params[:checked]。我需要将其作为对象传递,然后在收集完所有 id 后发布。

    $('#selectall').click(function(i, v){
      $('.css-checkbox').prop('checked', this.checked).trigger("change");
      $.post('user_exports/update_user_export_session', { object_ids: row_ids });
    });
    
    
    var row_ids = {};
    
    $('.css-checkbox').change(function(i, v){
      row_ids[$(this).val()] = this.checked
      });
    

    控制器代码:

     def update_user_export_session
    
      render :nothing => true
    
      session[:object_ids] ||= []
    
    if params[:object_ids]
     params[:object_ids].each do |object_id|    
    
       if object_id[1] == "true"
          session[:object_ids] << object_id[0] if ! session[:object_ids].include?(object_id[0])
       else
          session[:object_ids].delete(object_id[0])
       end
    
      end
    
     end
    
    end
    

    【讨论】: