Я уже некоторое время пытаюсь выучить Ruby & RoR, но у меня возникла проблема с поддержанием сортировки по ссылкам на страницы. У меня есть часть архитектуры MVC, так как я использовал подобную архитектуру в приложениях PHP. Я унаследовал приложение от другой группы разработчиков, которое содержит ошибку, которую мне нужно исправить.
На странице, отображающей клиентов для данного пользователя, существует разбиение на страницы для разделения списка на страницы по 20. Каждый столбец можно использовать для сортировки таблицы данных. После сортировки страницы по альтернативному столбцу, щелкнув одну из ссылок на страницы, вы перейдете на эту страницу, но вернете порядок сортировки к порядку по умолчанию.
Итак, общая идея заключается в том, что мне нужно сохранить параметры GET текущей страницы (с указанием порядка сортировки) в ссылках на нумерацию страниц.
Некоторые примеры URL:
Вот кодовые биты, которые, я думаю, могут иметь значение.
Контроллер: контроллеры / customer_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
Просмотр: просмотры / клиенты / 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