不需要的表单参数将附加到分页链接

| 我有一个页面,用于通过使用提供的表单提交数据来搜索列表。表单参数通过ajax(后请求)提交,在搜索表中创建新记录,然后通过此记录的“ 0”操作(动态地,在提交表单的同一页上)显示清单。 结果具有kaminari提供的分页链接,如下所示:
<%= paginate matches, 
  :params => {:controller => \'searches\',
  # I have to specify the id because my searches are stored in the database
  :action => \'show\', :id => search.id},
  :remote => true %>
请注意,分页链接是动态包含在页面中的。因此,当我进行新搜索并获得新列表时,服务器将重新提供分页链接。 这是我在搜索控制器中的表演动作
def show
  @search = Search.includes(:rate).find(params[:id])
  @matches = @search.matches.order(sort_column + \" \" + sort_direction).page(params[:page])

  respond_to do |format|
    format.html
    format.xml { render :xml => @matches }
    format.js
  end
end
由于某种原因,我无法弄清楚,我在搜索表单中使用的所有参数(其中有很多)都附加在kaminari分页网址上,从而为我提供了如下的hrefs:
<a href=\"/searches/145?massive parameter list omitted\" data-remote=\"true\" rel=\"next\">2</a>
省略的参数列表过长,以至于太大而无法成为有效的GET请求,并且我收到了
414
错误代码。 从搜索->显示上面的操作中可以看到,分页链接不必附加所有这些信息。他们所需要的只是路线,ID和页码。 如何防止这种情况发生? 顺便说一下,我尝试在kaminari选项中设置
:method => :post
。似乎没有帮助。我正在使用kaminari v 0.12.4(最新)和Rails 3.1.rc4。     
已邀请:
        大概的概念 您可以通过编辑分页部分来解决此问题,以手动从url中删除参数,然后重新添加页面参数。我知道这是一种破解,但如果分页被破坏(对我而言),这似乎是解决此问题的最快方法。 我正在从此问题的GitHub错误报告中发布的解决方案中扩展此功能。 您必须编辑5个分页链接部分:each6ѭ(按数字),
_first_page.html.erb
_last_page.html.erb
_prev_page.html.erb
_next_page.html.erb
。 您可以从局部变量中提供的局部变量中找到所需的页码:
current_page
page
num_pages
。 具体说明 如果尚未安装,请通过运行
rails g kaminari:views default
在应用中生成分页部分 然后按如下所示编辑部分:
#_page.html.erb
<%
 unless page.current?
   url = url.split(\'?\')[0] + \'?page=\' + page.to_s
 end
%>

<span class=\"page<%= \' current\' if page.current? %>\">
  <%= link_to_unless page.current?, page, url, opts = {:remote => remote, :rel => page.next? ? \'next\' : page.prev? ? \'prev\' : nil} %>
</span>

# _first_page.html.erb
<span class=\"first\">
  <% url = url.split(\'?\')[0] + \'?page=1\' %>
  <%= link_to_unless current_page.first?, raw(t \'views.pagination.first\'), url, :remote => remote %>
</span>

# _prev_page.html.erb
<span class=\"prev\">
  <% url = url.split(\'?\')[0] + \'?page=\' + (current_page.to_i - 1).to_s %>
  <%= link_to_unless current_page.first?, raw(t \'views.pagination.previous\'), url, :rel => \'prev\', :remote => remote %>
</span>

# _next_page.html.erb
<span class=\"next\">
  <% url = url.split(\'?\')[0] + \'?page=\' + (current_page.to_i + 1).to_s %>
  <%= link_to_unless current_page.last?, raw(t \'views.pagination.next\'), url, :rel => \'next\', :remote => remote %>
</span>

# _last_page.html.erb
<span class=\"last\">
  <% url = url.split(\'?\')[0] + \'?page=\' + num_pages.to_s %>
  <%= link_to_unless current_page.last?, raw(t \'views.pagination.last\'), url, {:remote => remote} %>
</span>
    
        如果有人仍然对分页链接有问题,请在此处进行修复:Kaminari:从分页链接中排除基本形式参数 尽管它对我不起作用,如提交描述中所述,但链接中仍然存在不需要的参数(:authenticity_token,:commit,:utf8,:_ method),但是可以通过将它们设置为nil来排除它们 例如:
paginate @books, params: {authenticity_token: nil, commit: nil, utf8: nil, action: nil}
结果:
<a href=\"/books?page=2\">2</a>
要么 控制器:
def index
  # here search staff, messing our params hash
  @books = Books.all
  @pagination_params = normalize_pagination_params
end

private
def normalize_pagination_params
 params.inject({}) do |params_hash, p|
  unless p[0]==\"controller\"
    params_hash[p[0]] = nil
  end
  params_hash
 end
end
视图:
paginate @books, params: @pagination_params
    
        您可以通过仅保留所需的内容并删除其他所有内容,然后再显示搜索结果来尝试清理参数。 要使用帖子,我认为您错过了第二步,您必须重写kaminari链接部分:https://github.com/amatsuda/kaminari/wiki/Kaminari-recipes     
        旧帖子。更好的解决方案。 如果您使用kaminari通过ajax更新对嵌套资源进行分页,则会发现Kaminari尝试根据当前路径构建url,而不管您指定的参数如何,从而导致路由错误。 最干净的解决方案是使用通配符路由。 如果您对某篇文章进行分页评论,并且具有带创建和显示操作的评论控制器,则: 在您的路线中:
match \'*path/comments(/:page)\' => \'comments#show\'
和分页小部件:
<%= paginate @comments, params: { controller: :comments }, remote: true %>
    

要回复问题请先登录注册