【问题标题】:Unwanted form parameters being appended to pagination links将不需要的表单参数附加到分页链接
【发布时间】:2011-09-13 17:59:45
【问题描述】:

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

如何防止这种情况发生?

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

【问题讨论】:

  • 能否提供生成搜索链接的代码?它只是一个search_path吗?您是否使用任何 gem 进行搜索?
  • 对不起,我不明白。搜索链接是什么意思?搜索是通过一个表单完成的,该表单通过 POST 请求提交给searches_create_path
  • 这个问题你解决了吗?我正在经历非常相似的一个?如果是,请提供一些线索。问候
  • 不,我从来没有深究。我离开了那个项目。

标签: ruby ruby-on-rails-3 pagination kaminari


【解决方案1】:

如果有人仍然有分页链接的问题,这里有一个修复: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

【讨论】:

    【解决方案2】:

    总体思路

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

    我正在从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

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

    【讨论】:

    • 有人知道如何解决高亮问题吗?
    • 给你一条上船。很遗憾我们需要像这样破解它,但让我的应用程序使用你的代码。 (不确定 Brendan 的突出问题是什么;对我来说工作正常。)
    • 添加到这个实用程序:我还需要保留参数,但将它们放在发布数据中。您可以从拆分右侧获取数据,并将它们添加到 :data =&gt; {:params =&gt; data} 元素中,rails ujs 会在 post 调用中为您愉快地序列化它!
    • kaminari:num_pages 已重命名为 total_pages
    • 我尝试了@DGM 你的建议以保留参数,但我的参数丢失了。这是我的_last_page.html.erb&lt;% data = Rack::Utils.parse_query URI(url).query %&gt; 的行,以便我保存我的参数,这是我到该页面的链接:&lt;%= link_to_unless current_page.last?, t('views.pagination.last').html_safe, url, :remote =&gt; remote, :method =&gt; method, :data =&gt; { params: data } %&gt;。谁能告诉我我做错了什么?
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      旧帖。更好的解决方案。

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

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

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

      在您的路线中:

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

      还有分页小部件:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 2019-01-26
        • 2013-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多