Ruby on rails RubyonRails分页-维护排序参数
我已经试着学习Ruby&RoR有一段时间了,但是在维护分页链接排序时遇到了一个难题。由于我在PHP应用程序中使用了类似的体系结构,所以我已经放弃了MVC体系结构部分。我从另一组开发人员那里继承了一个应用程序,其中包含需要更正的错误 在为给定用户列出客户的页面上,有分页将列表拆分为20页。每列可用于对数据表进行排序。一旦页面按备用列排序,单击其中一个分页链接将转到该页面,但将排序顺序恢复为默认顺序 因此,一般的想法是,我需要在分页链接中维护当前页面的GET参数(指定排序顺序) 一些示例URL: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:
- 默认值:
- 按名称排序:
- 单击第2页:website.com/users/34/customers?第2页
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 '<', pagination_prev_link(:params => flatten_hash(params.dup.delete(:page))) if pagination_prev_link
...
= link_to '>', 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 '<', 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 '>', 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后将其全部扔掉。