11

我有一个页面,用于通过使用提供的表单提交数据来搜索列表。表单参数通过 ajax(发布请求)提交,在搜索表中创建一个新记录,然后通过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 %>

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

这是我在搜索控制器中的显示操作

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:

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

省略的参数列表太长以至于不能成为有效的 GET 请求,并且我收到414错误代码。

正如您从我上面的搜索 - > 显示操作中看到的那样,分页链接没有必要附加所有这些信息。他们所需要的只是路线、ID 和页码。

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

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

4

4 回答 4

8

如果有人仍然有分页链接的问题,这里有一个修复:Kaminari: Exclude basic form params from pagination links

虽然它对我不起作用,正如提交描述中所描述的那样,链接中仍然有不需要的参数(: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
于 2014-06-18T14:28:49.303 回答
6

大概的概念

您可以通过编辑分页部分以手动从 url 中删除参数来解决此问题,然后将页面参数添加回来。我知道这是一个 hack,但如果分页被破坏(就像我一样),这似乎是解决这个问题的最快方法。

我正在从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>
于 2011-09-21T16:17:48.920 回答
0

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

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

于 2011-07-01T10:17:49.870 回答
0

旧帖。更好的解决方案。

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

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

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

在您的路线中:

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

和分页小部件:

<%= paginate @comments, params: { controller: :comments }, remote: true %>
于 2013-05-15T22:03:51.933 回答