Rails:在更改事件时向控制器发布多个复选框值

时间:2014-08-26 14:57:33

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

我有一个包含多个对象的分页表,并希望将其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方法,但会话[:object_ids]最终只有一个ID。

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。在触发更改事件时,虽然它被记录为发生在控制器的单独帖子中,但实际上它会立即发送所有更改事件,因此控制器中的逻辑仅解释了最后一个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