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


我有一个页面,用于通过使用提供的表单提交数据来搜索列表。表单参数通过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 %>

请注意,分页链接会动态包含在页面中。因此,当我进行新搜索并获取新列表时,服务器会重新呈现分页链接。

这是我在搜索控制器中的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分页网址,给我这样的href:

<a href="/searches/145?massive parameter list omitted" data-remote="true" rel="next">2</a>

省略的参数列表太长,以至于它太大而无法成为有效的GET请求而且我得到了一个 414 错误代码。

正如你从上面的搜索 - > show动作中看到的那样,分页链接不必附加所有这些信息。他们所需要的只是路线,身份证和页码。

我该如何防止这种情况发生?

顺便说一下,我试过设置 :method => :post 在kaminari选项中。似乎没有帮助。我正在使用kaminari v 0.12.4(最新)和Rails 3.1.rc4。


4669
2018-06-13 07:57


起源

您能否提供生成搜索链接的代码?它是一个search_path吗?您是否使用任何宝石进行搜索? - Fernando Diaz Garrido
对不起,我害怕我不明白。搜索链接是什么意思?搜索是通过提交给的表单完成的 searches_create_path 通过POST请求。 - David Tuite
你解决了这个问题吗?我遇到了非常相似的一个?如果是,请提供一些线索。问候 - Piotr Mąsior
不,我从来没有深究过它。我继续从那个项目开始。 - David Tuite


答案:


大概的概念

您可以通过编辑分页部分来手动从网址中删除参数,然后再添加页面参数来解决此问题。我知道这是一个黑客,但如果分页被打破(这对我而言)似乎是解决这个问题的最快方法。

我正在通过发布的解决方案扩展这一点 GitHub针对此问题的错误报告

您必须编辑5个分页链接部分中的每一个: _page.html.erb (按编号), _first_page.html.erb 和 _last_page.html.erb_prev_page.html.erb 和 _next_page.html.erb

您可以从部分中可用的局部变量中找到所需的页码: current_pagepagenum_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>

6
2017-09-21 16:17



有谁知道如何解决突出显示? - BrendanDean
适合你的快艇。很遗憾,我们需要像这样破解它,但让我的应用程序使用您的代码。 (不确定布兰登的突出问题是什么;为我工作正常。) - Rob d'Apice
添加到这个实用程序:我还需要保留params,但将它们放在post数据中。您可以从分割的右侧获取数据,并将它们添加到a :data => {:params => data} 元素和rails ujs会很乐意在邮件中为你序列化它! - DGM
kaminari:num_pages已重命名为total_pages - rigyt
我尝试了@DGM你的建议,以保持参数,但我的参数迷路了。这是我的线 _last_page.html.erb 同 <% data = Rack::Utils.parse_query URI(url).query %> 为了得到我的保存我的参数,这里是我的链接到该页面: <%= link_to_unless current_page.last?, t('views.pagination.last').html_safe, url, :remote => remote, :method => method, :data => { params: data } %>。谁能告诉我我做错了什么? - ma3x


如果有人仍然有分页链接的问题,这里有一个修复: Kaminari:从分页链接中排除基本形式参数

虽然它不能像我在提交描述中描述的那样起作用,但链接中仍然存在不需要的参数(:authenticity_token,:commit,:utf8,:_ method),但您可以通过将它们设置为

例如:

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

6
2018-06-18 14:28





您可以尝试通过仅保留所需内容来清除params,并在显示搜索结果之前删除其他所有内容。

要使用帖子我认为你错过了第二步,你必须覆盖kaminari链接部分: https://github.com/amatsuda/kaminari/wiki/Kaminari-recipes


0
2017-07-01 10:17





老邮政。更好的方案。

如果您使用kaminari对具有ajax更新的嵌套资源进行分页,您会发现Kaminari会尝试根据当前路径构建URL,而不管您指定的参数如何,从而导致路由错误。

最干净的解决方案是使用通配符路由。

如果您对帖子的分页评论有一个带有创建和显示操作的评论控制器,那么:

在你的路线:

match '*path/comments(/:page)' => 'comments#show'

分页小部件:

<%= paginate @comments, params: { controller: :comments }, remote: true %>

0
2018-05-15 22:03