不需要的表单参数将附加到分页链接
我有一个页面,用于通过使用提供的表单提交数据来搜索列表。 表单参数通过ajax(post request)提交,在搜索表中创建一个新记录,然后通过此记录的show
动作显示列表(动态地,在表单提交的同一页面上)。
结果有kaminari提供的分页链接,如下所示:
{:controller => 'searches', # I have to specify the id because my searches are stored in the database :action => 'show', :id => search.id}, :remote => true %>
请注意,分页链接会动态包含在页面中。 因此,当我进行新搜索并获取新列表时,服务器会重新呈现分页链接。
这是我在搜索控制器中的show动作
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分页url,给我这样的href:
2
省略的参数列表太长,以至于它太大而无法成为有效的GET请求,我得到414
错误代码。
正如你从上面的搜索 – > show动作中看到的那样,分页链接不必附加所有这些信息。 他们所需要的只是路线,身份证和页码。
我该如何防止这种情况发生?
顺便说一下,我尝试过设置:method => :post
在kaminari选项中发布。 似乎没有帮助。 我正在使用kaminari v 0.12.4(最新)和Rails 3.1.rc4。
大概的概念
您可以通过编辑分页部分来手动从url中删除参数,然后再添加页面参数来解决此问题。 我知道这是一个黑客,但如果分页被打破(这对我而言)似乎是解决这个问题的最快方法。
我正在从这个问题的GitHub错误报告中发布的解决方案中扩展它。
您必须编辑5个分页链接部分中的每一个: _page.html.erb
(按编号), _first_page.html.erb
和_last_page.html.erb
, _prev_page.html.erb
和_next_page.html.erb
。
您可以从partials中提供的局部变量中找到所需的页码: 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 %> <%= link_to_unless page.current?, page, url, opts = {:remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil} %> # _first_page.html.erb <% url = url.split('?')[0] + '?page=1' %> <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, :remote => remote %> # _prev_page.html.erb <% 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 %> # _next_page.html.erb <% 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 %> # _last_page.html.erb <% url = url.split('?')[0] + '?page=' + num_pages.to_s %> <%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {:remote => remote} %>
如果有人仍然有分页链接的问题,这里有一个修复: Kaminari:从分页链接中排除基本forms参数
虽然它不能像我在提交描述中描述的那样起作用,但链接中仍然存在不需要的参数(:authenticity_token,:commit,:utf8,:_ method),但您可以通过将它们设置为nil来排除它们
例如:
paginate @books, params: {authenticity_token: nil, commit: nil, utf8: nil, action: nil}
结果:
2
要么
控制器:
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
您可以尝试通过仅保留所需内容来清除params,并在显示搜索结果之前删除其他所有内容。
要使用post我认为你错过了第二步,你必须覆盖kaminari链接部分: https : //github.com/amatsuda/kaminari/wiki/Kaminari-recipes
老邮政。 更好的方案。
如果您使用kaminari对具有ajax更新的嵌套资源进行分页,您会发现Kaminari会尝试根据当前路径构建URL,而不管您指定的参数如何,从而导致路由错误。
最干净的解决方案是使用通配符路由。
如果您对post的分页评论有一个带有创建和显示操作的评论控制器,那么:
在你的路线:
match '*path/comments(/:page)' => 'comments#show'
分页小部件:
<%= paginate @comments, params: { controller: :comments }, remote: true %>