我有一个包含多个对象的分页表,并希望将其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。
答案 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