我有一个页面,用于通过提交数据使用提供的表单搜索列表.表单参数通过ajax(post request)提交,在搜索表中创建一个新记录,然后通过该记录的显示操作显示列表(动态地,在表单提交的同一页面上).
<%= 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和页码.
如何防止这种情况发生?
顺便说一下,我试过设置:method =>发表在kaminari选项.似乎没有帮助我正在使用kaminari v 0.12.4(最新)和Rails 3.1.rc4.
解决方法
大概的概念
您可以通过编辑分页部分来修复此问题,以手动从URL中删除参数,然后添加页面参数.我知道这是一个黑客,但是如果分页被打破,就像解决这个问题的最快方法(就像我这样).
我正在从GitHub bug report for this issue发布的解决方案扩展.
您必须编辑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 %> <span class="page<%= ' current' if page.current? %>"> <%= link_to_unless page.current?,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'),: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'),: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'),: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'),{:remote => remote} %> </span>