Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 附加到分页链接的不需要的表单参数_Ruby_Ruby On Rails 3_Pagination_Kaminari - Fatal编程技术网

Ruby 附加到分页链接的不需要的表单参数

Ruby 附加到分页链接的不需要的表单参数,ruby,ruby-on-rails-3,pagination,kaminari,Ruby,Ruby On Rails 3,Pagination,Kaminari,我有一个页面,用于通过使用提供的表单提交数据来搜索列表。表单参数通过ajax(post请求)提交,在搜索表中创建一条新记录,然后通过该记录的show操作显示列表(动态地,在提交表单的同一页面上) 结果具有kaminari提供的分页链接,如下所示: <%= paginate matches, :params => {:controller => 'searches', # I have to specify the id because my searches are

我有一个页面,用于通过使用提供的表单提交数据来搜索列表。表单参数通过ajax(post请求)提交,在搜索表中创建一条新记录,然后通过该记录的
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 %>
出于某种原因,我无法理解,我在搜索表单中使用的所有参数(其中有很多)都被附加到kaminari分页URL,从而提供如下HREF:

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

省略的参数列表太长,太大,无法作为有效的GET请求,我得到了
414
错误代码

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

如何防止这种情况发生


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

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

要使用post,我认为您错过了第二步,您必须覆盖kaminari链接部分:

概述 您可以通过编辑分页部分来修复此问题,手动从url中删除参数,然后重新添加页面参数。我知道这是一个黑客行为,但如果分页被破坏(对我来说也是如此),这似乎是解决这个问题的最快方法

我将从中发布的解决方案扩展此功能

您必须编辑5个分页链接部分:
\u page.html.erb
(按编号)、
\u first\u page.html.erb
\u last\u page.html.erb
\u prev\u page.html.erb
\u next\u page.html.erb

您可以从以下部分中提供的局部变量中找到所需的页码:
current\u page
page
num\u page

具体说明 如果还没有,请运行
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>
#u page.html.erb
远程,:rel=>page.next下一页“:page.prev??”上一个“:nil}%>
#_first_page.html.erb
远程%>
#_prev_page.html.erb
'prev',:remote=>remote%>
#_next_page.html.erb
“下一步”:远程=>remote%>
#_last_page.html.erb
远程}%>

旧帖子。更好的解决方案

如果您使用kaminari对ajax更新的嵌套资源进行分页,您会发现kaminari试图基于当前路径构建url,而不管您指定的参数是什么,这会导致路由错误

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

如果您正在为帖子分页注释,并且有一个带有创建和显示操作的注释控制器,则:

在您的路线中:

match '*path/comments(/:page)' => 'comments#show'
和分页小部件:

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

如果有人仍然存在分页链接问题,这里有一个修复程序:

虽然,它对我不起作用,正如提交描述中所述,链接中仍然有不需要的参数(: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>
视图:


您能提供生成搜索链接的代码吗?这只是一条搜索路径吗?你用宝石做搜索吗?对不起,我不明白。你所说的搜索链接是什么意思?搜索是通过一个表单完成的,该表单通过POST请求提交到
searches\u create\u path
。您解决了这个问题吗?我正在经历非常相似的一个?如果是,请提供一些线索。事实上,我从来没有追根究底过。我离开了那个项目。有人知道如何修复突出显示吗?这对你来说是个好消息。很遗憾,我们需要像这样破解它,但我的应用程序可以使用你的代码。(不确定Brendan的突出显示问题是什么;对我来说效果很好。)为了增加这个功能:我还需要保留参数,但将它们放在post数据中。您可以从拆分的右侧抓取数据,并将它们添加到
:data=>{:params=>data}
元素中,rails ujs将很高兴在post调用中为您序列化它!kaminari:num_pages已重命名为total_pages我尝试了@DGM您的建议以保留参数,但我的参数丢失了。这是我的
\u last_page.html.erb
中的一行,以便获取我的save my params,这是我到该页面的链接:
remote,:method=>method,:data=>{params:data}%>
。谁能告诉我我做错了什么?
<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