3

我正在使用 will_paginate 列出不同页面中的大量文件。我还有一个复选框,以便为进一步分析选择文件。

控制器:

@files = FileDB.search(search_string).paginate(:per_page => 10, :page => params[:page]) 

看法:

  <button type="button" id="check_all">Check/Uncheck all</button>
 <%= button_tag :class => "btn btn-primary", :name => 'analyse' do %>Analyse<% end %>

    <% @filess.each do |file| %>
    <p><td> <%= check_box_tag "files[]", file.id %></td><%= file.name %></p>
    lala...

我的问题是我可以选择位于一页中的文件。因此,通过单击“全部选中/取消选中”,它检查的不是所有可用文件,而是该特定页面的文件。我希望能够一起检查来自不同页面的不同文件。

示例:第 1 页有 10 个文件,第 2 页有 4 个文件。我想检查第 1 页的 5 个文件和第 2 页的所有文件,然后单击“分析”按钮,这 9 个文件必须一起分析,所以复选框应该记住来自不同页面的不同文件

提前致谢

根据 juanpastas 的解决方案进行编辑

看法:

 <script type='text/javascript'>    
 // see note below
sessionStorage.fileIds = ' ';

// this way:
// 1. you execute the function appending just one handler
// 2. you can change content of .checkboxes-container with AJAX to do pagination

$('.checkboxes-container').on('change', ':checkbox', function(){
  // search for "space id space", examples: " 1 " or " 10 "
  var id = new RegExp(' ' + this.value + ' ');

  // get that part of the string
  var match = (sessionStorage.fileIds.match(id) || [])[0];

  // toggle value, this is: replicate check box behaviour in this variable
  // ids will be saved as " 1 2 3 10 15 ", spaces in both sides to eliminate special cases.
  if(match) sessionStorage.fileIds = sessionStorage.fileIds.replace(id, ' ');

  else sessionStorage.fileIds = sessionStorage.fileIds + this.value + ' ';

})
</script>
 <script type='text/javascript'>   
$('[name=analyse]').click(function(){
  // " 1 2 3 10 " is sent as [1,2,3,10]
  var fileIds = sessionStorage.ids.split(',').filter(function(e){if(e[0]) return e;})

  // change url, check server is receiving an array.
  $.get('/files', { file_ids: fileIds });
})
</script>
                    <%= form_for Group.new, url: what_to_do_files_path ,method: :get ,:validate => true do |f| %>


                    <div class="field">
                    <%=f.text_field :group_name, placeholder: "Group Name" %>&nbsp;&nbsp;
                    </div>

                    <%= button_tag :class => "btn btn-primary", :name => 'analyse' do %>Analyse;<% end %>
                    <button type="button" id="check_all" class="btn"> Check/Uncheck all</button>

                        <% @files.each do |file| %>
                        <p><td> <%= check_box_tag "files[]", file.id , false %></td>file.name</p>




                        <%end%>

                  <%end%> 

控制器:

what_to_do
    a = params[:file_ids].split(',')
end

它向我显示了一个错误,即 Nil cless 没有拆分功能,因此 params[:file_ids] 为空,尽管我检查了 check_boxes

4

3 回答 3

1

您需要以某种方式保存所选项目,例如在会话(客户端或服务器)或隐藏输入中。

这是保存在浏览器会话中:

// see note below
sessionStorage.fileIds = ' ';

// this way:
// 1. you execute the function appending just one handler
// 2. you can change content of .checkboxes-container with AJAX to do pagination

$('.checkboxes-container').on('change', ':checkbox', function(){
  // search for "space id space", examples: " 1 " or " 10 "
  var id = new RegExp(' ' + this.value + ' ');

  // get that part of the string
  var match = (sessionStorage.fileIds.match(id) || [])[0];

  // toggle value, this is: replicate check box behaviour in this variable
  // ids will be saved as " 1 2 3 10 15 ", spaces in both sides to eliminate special cases.
  if(match) sessionStorage.fileIds = sessionStorage.fileIds.replace(id, ' ');

  else sessionStorage.fileIds = sessionStorage.fileIds + this.value + ' ';

})

然后,当单击分析时,您可以发送所有这些 id:

$('[name=analyse]').click(function(){
  // " 1 2 3 10 " is sent as [1,2,3,10]
  var fileIds = sessionStorage.ids.split(',').filter(function(e){if(e[0]) return e;})

  // change url, check server is receiving an array.
  $.get('/files', { file_ids: fileIds });
})

检查这个

在控制器中:

before_filter :make_array_from_file_ids


def make_array_from_file_ids
  # this depends on the name you used in AJAX call
  params[:file_ids] = params[:file_ids].split ','
end

注意我不确定你是否需要在控制器中使用它。也许不吧。也许你需要一些不同的东西。

于 2013-07-19T12:54:43.520 回答
0

如果你想检查一些复选框和提交按钮,你想做一些分析的东西,那么我建议你先构建一个表单。复选框无法记住来自不同页面的文件,您必须将这些复选框放入表单中。

于 2013-07-19T12:57:35.463 回答
0

为此,您可以在 rails 3 中选择“turbolink gem”,因为当您在第 1 页中选择某个文件并在第 2 页中选择其他一些文件时,所有文件都会组合在一起,然后您可以进行分析。

gem 'turbolinks'

之后需要对控制器进行少量更改。访问:- http://railscasts.com/episodes/390-turbolinks

于 2013-07-19T12:18:07.793 回答