Dav*_*ite 11 ruby pagination ruby-on-rails-3 kaminari
我有一个页面,用于通过使用提供的表单提交数据来搜索列表.表单参数通过ajax(post request)提交,在搜索表中创建一个新记录,然后通过show此记录的操作显示(动态地,在表单提交的同一页面上).
结果有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 %>
Run Code Online (Sandbox Code Playgroud)
请注意,分页链接会动态包含在页面中.因此,当我进行新搜索并获取新列表时,服务器会重新呈现分页链接.
这是我在搜索控制器中的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
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我无法弄清楚,我在搜索表单中使用的所有参数(以及其中有很多)都被附加到kaminari分页网址,给我这样的href:
<a href="/searches/145?massive parameter list omitted" data-remote="true" rel="next">2</a>
Run Code Online (Sandbox Code Playgroud)
省略的参数列表太长,以至于它太大而无法成为有效的GET请求,我得到一个414错误代码.
正如您从上面的搜索 - > show动作中看到的那样,分页链接不必附加所有这些信息.他们所需要的只是路线,身份证和页码.
我该如何防止这种情况发生?
顺便说一句,我已经尝试过设置:method => :postkaminari选项.似乎没有帮助.我正在使用kaminari v 0.12.4(最新)和Rails 3.1.rc4.
如果有人仍然有分页链接的问题,这里有一个修复:Kaminari:从分页链接中排除基本形式参数
虽然,这是行不通的形成我,因为它是在提交描述中,仍存在链接不需要PARAMS(:authenticity_token,:提交,:UTF8,:_method),但你可以通过设置它们将它们排除在外零
例如:
paginate @books, params: {authenticity_token: nil, commit: nil, utf8: nil, action: nil}
Run Code Online (Sandbox Code Playgroud)
结果:
<a href="/books?page=2">2</a>
Run Code Online (Sandbox Code Playgroud)
要么
控制器:
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
Run Code Online (Sandbox Code Playgroud)
视图:
paginate @books, params: @pagination_params
Run Code Online (Sandbox Code Playgroud)
您可以通过编辑分页部分来手动从网址中删除参数,然后再添加页面参数来解决此问题.我知道这是一个黑客,但如果分页被打破(这对我来说)似乎是解决这个问题的最快方法.
我正在从这个问题的GitHub错误报告中发布的解决方案中扩展它.
你必须编辑每个5分页链接泛音:_page.html.erb(数),_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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3873 次 |
| 最近记录: |