Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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 on rails RubyonRails分页-维护排序参数_Ruby On Rails_Model View Controller_Pagination_Haml - Fatal编程技术网

Ruby on rails RubyonRails分页-维护排序参数

Ruby on rails RubyonRails分页-维护排序参数,ruby-on-rails,model-view-controller,pagination,haml,Ruby On Rails,Model View Controller,Pagination,Haml,我已经试着学习Ruby&RoR有一段时间了,但是在维护分页链接排序时遇到了一个难题。由于我在PHP应用程序中使用了类似的体系结构,所以我已经放弃了MVC体系结构部分。我从另一组开发人员那里继承了一个应用程序,其中包含需要更正的错误 在为给定用户列出客户的页面上,有分页将列表拆分为20页。每列可用于对数据表进行排序。一旦页面按备用列排序,单击其中一个分页链接将转到该页面,但将排序顺序恢复为默认顺序 因此,一般的想法是,我需要在分页链接中维护当前页面的GET参数(指定排序顺序) 一些示例URL:

我已经试着学习Ruby&RoR有一段时间了,但是在维护分页链接排序时遇到了一个难题。由于我在PHP应用程序中使用了类似的体系结构,所以我已经放弃了MVC体系结构部分。我从另一组开发人员那里继承了一个应用程序,其中包含需要更正的错误

在为给定用户列出客户的页面上,有分页将列表拆分为20页。每列可用于对数据表进行排序。一旦页面按备用列排序,单击其中一个分页链接将转到该页面,但将排序顺序恢复为默认顺序

因此,一般的想法是,我需要在分页链接中维护当前页面的GET参数(指定排序顺序)

一些示例URL:

  • 默认值:
  • 按名称排序:
  • 单击第2页:website.com/users/34/customers?第2页
以下是我认为可能相关的代码位

控制器:控制器/customer\u Controller.rb

def index
  @customer = Customer.new(params[:customer])
  @customer.user_id = (current_user.sales_director? || current_user.admin?) ? params[:user_id] : current_user.id
  @customer_pages, @customers = paginate  :customers,
                                        :joins => "INNER JOIN sources ON customers.source_id=sources.id INNER JOIN locations ON customers.location_id=locations.id",
                                        :select => "customers.*, sources.name AS source_name, locations.name AS location_name",
                                        :conditions => @customer.search_conditions,
                                        :per_page => 20,
                                        :order => @customer.search_order
end
视图:views/customers/index.haml

%h1=User.find(params[:user_id]).full_name + "'s Customers"

.action_links
  - if !current_user.viewer?
    = link_to '+ Add New Customer', new_customer_path
    |
  = link_to 'View Follow Up Reminders', reminders_user_path(@user)

=render :partial => 'search_form'
%br/

- if @customer_pages.page_count > 1
  .pagination_links
    Go to page:
    = link_to '<', pagination_prev_link if pagination_prev_link
    = pagination_links @customer_pages, :window_size => 5, :params => flatten_hash(params.dup.delete(:page))
    = link_to '>', pagination_next_link(@customer_pages.page_count) if pagination_next_link(@customer_pages.page_count)


- if @customers.size > 0
  = render :partial => 'search_results'
- else
  %p.no_results No customers matching your search criteria were found. Please try searching again.


- if @customer_pages.page_count > 1
  .pagination_links
    Go to page:
    = link_to '<', pagination_prev_link if pagination_prev_link
    = pagination_links @customer_pages, :window_size => 5, :params => flatten_hash(params.dup.delete(:page))
    = link_to '>', pagination_next_link(@customer_pages.page_count) if pagination_next_link(@customer_pages.page_count)
我真的很感激任何帮助,我可以得到如何我可以修改这使这发生。如果需要任何其他代码示例,请告诉我

谢谢

编辑:以下是上一页和下一页链接的代码(这些链接工作正常)。希望有一种方法能有助于找到让#链接也起作用的方法

#module ApplicationHelper

  # Took these next 2 methods from a blog post I found here: http://marklunds.com/articles/one/314
  # to help deal with a nested hash in params
  def flatten_hash(hash = params, ancestor_names = [])
    return if !hash 
    flat_hash = {}
    hash.each do |k, v|
      names = Array.new(ancestor_names)
      names << k
      if v.is_a?(Hash)
        flat_hash.merge!(flatten_hash(v, names))
      else
        key = flat_hash_key(names)
        key += "[]" if v.is_a?(Array)
        flat_hash[key] = v
      end
    end
    flat_hash
  end

  def flat_hash_key(names)
    names = Array.new(names)
    name = names.shift.to_s.dup 
    names.each do |n|
      name << "[#{n}]"
    end
    name
  end


  # pagination link helpers (because default one is kinda broken)
  def pagination_prev_link
    prev_link = params.clone
    if params[:page].to_i - 1 > 0
      prev_link[:page] = prev_link[:page].to_i - 1
      flatten_hash(prev_link)
    else
      false
    end
  end

  def pagination_next_link(max)
    next_link = params.clone
    if params[:page].to_i < max
      next_link[:page] = 1 if next_link[:page].to_i == 0
      next_link[:page] = next_link[:page].to_i + 1
      flatten_hash(next_link)
    else
      false
    end
  end
#模块应用程序助手
#下面两种方法是我在这里发现的博客文章中得出的:http://marklunds.com/articles/one/314
#帮助处理参数中的嵌套哈希
def展平\u散列(散列=参数,祖先\u名称=[])
如果需要,请返回!搞砸
平面散列={}
hash.each do | k,v|
名称=数组。新(祖先名称)

名称我不确定分页使用的是什么。如果你能和或一起去,他们会帮你处理这类事情

如果这是太多的重构,这里有一些东西可以尝试与您当前的设置

看起来这个
:params=>flant_散列(params.dup.delete(:page))
正在做您正在寻找的事情。问题是,它只适用于页码链接,而不适用于上一个/下一个链接。编号的分页链接是否正常工作,或者是否也断开了

如果我是你的话,我会尝试更改下一个和上一个链接,看看它是否有效

= link_to '&lt;', pagination_prev_link(:params => flatten_hash(params.dup.delete(:page))) if pagination_prev_link
...
= link_to '&gt;', pagination_next_link(@customer_pages.page_count, :params => flatten_hash(params.dup.delete(:page))) if pagination_next_link(@customer_pages.page_count)
如果这不起作用,也许你可以找到
分页_prev_link
分页_next_link
的位置,并定义和发布该代码

更新:

我真的不明白什么需要
flatte\u hash
方法。所以我不带它就试试。此外,还可以更明确地说明散列参数,以防万一,即使您不必这样做

= pagination_links @customer_pages, {:window_size => 5, :params => params.dup.delete(:page)}, {}
如果这不起作用,您可以尝试手动传入一些参数,看看它是否起作用

= pagination_links @customer_pages, {:params => {:test_param => 1}}, {}

好吧,所以我对我正在做的事情了解得足够多,所以我想出了一个简单的解决方案。。。但它似乎在按预期工作

已将新功能添加到应用程序帮助程序:

  def pagination_page_link(p)
    page_link = params.clone
    page_link[:page] = p
    flatten_hash(page_link)
  end
以下内容在视图文件中使用了两次,以替换输出编号链接的原始行

- if @customer_pages.page_count > 1
  .pagination_links
    Go to page:
    = link_to '&lt;', pagination_prev_link if pagination_prev_link
    - @customer_pages.each do |page|
      = page.number if @customer_pages.current_page.number == page.number
      = link_to page.number, pagination_page_link(page.number) unless @customer_pages.current_page.number == page.number
    -#= pagination_links @customer_pages, :window_size => 5, :params => flatten_hash(params.dup.delete(:page))
    = link_to '&gt;', pagination_next_link(@customer_pages.page_count) if pagination_next_link(@customer_pages.page_count)

我对编号链接中的:params条目也有同样的想法。不幸的是,它实际上并没有将现有参数附加到编号的链接。编号的链接是目前的优先事项。我想如果我弄清楚这些,我可以让上一个和下一个工作。如果我不能,我愿意删除它们,只留下编号的链接。我搜索了应用程序代码,但应用程序中没有定义“分页链接”,因此它必须是ruby或rails的一部分(我想)。该页面上也有可用的源代码,因此希望这有助于诊断问题。事实证明,“上一页”和“下一页”<>链接工作正常。它们实际上维护参数。编号链接是唯一的问题。我将用pagination_prev_link函数的代码更新我的问题。哇,
pagination_links
从1.2.6开始就没有出现在Rails中。这在Rails的世界里真的很古老。你的应用程序运行的是什么版本的Rails?我会用其他方法更新我的答案。别忘了
will_paginate
可以从带有隐藏字段的表单中获取参数(尽管获取请求)肯定会缩短原始问题并包含
pagination\u链接的代码。但是,由于这段代码已经证明自己很难调试和维护,我真诚地建议您在修复它并切换到will_paginate后将其全部扔掉。