Вопрос по ruby, ruby-on-rails – Страница предмета и will_paginate

7

У меня есть несколько фотографий, которые разделены на последовательные страницы с помощью плагина will_paginate. Когда вы открываете фотографию и затем возвращаетесь ко всем фотографиям, используя ссылку, вы всегда возвращаетесь на первую страницу (например, фотография отображается на странице 5, вы открываете фотографию, нажимаете ссылку, чтобы показать все фотографии и ожидаете, что вы находитесь на страница 5, но вы находитесь на странице 1).

Теперь, есть ли способ получить номер страницы, к которой принадлежит фотография?

Я попытался передать параметр GET, но это работает, только если пользователь больше не выполняет никаких действий (например, опубликовать комментарий, отредактировать фотографию и т. Д.).

Ваш Ответ

3   ответа
8
page = (number_of_records_before_RECORD / number_of_records_per_page) + 1

ыло 25 записей (при условии, что некоторые записи были удалены), по 20 записей на странице:

page = (25 / 20) + 1 = 2

Вы можете посчитать количество записей до выбранной записи, используяModel.count(:conditions => ['id < ?', record.id], :order => 'id'). Правильный запрос зависит от того, какой фильтр сортировки вы применяете к этой таблице при перечислении всех объектов.

Это может быть решением, но мне интересно, почему этот код не реализован по умолчанию в плагине. Возможно, потому что не имеет смысла делать то, что я сказал с точки зрения производительности .. collimarco
Потому что это не имеет смысла для широкой аудитории. Это не идеальное решение, а просто обходной путь для ваших конкретных потребностей. Кроме того, will_paginate предоставляет возможности разбивки на страницы, а не дополнительные функции ActiveRecord. Simone Carletti
Я бы не подумал, что это будет огромный успех. Когда вы используете библиотеку разбиения на страницы, она подсчитывает все, что вы делаете, чтобы получить общее количество страниц. Если столбец, по которому вы заказываете, проиндексирован правильно, тогда не должно быть слишком больно получать аналогичный счетчик для поиска текущей страницы. Shadwell
Также стоит, если возможно, выполнить подсчет, чтобы найти текущую страницу в той же транзакции, что и запрос для поиска элементов на странице - в противном случае пользователь может оказаться на странице, на которой нет фотографии, которой он был ожидая, потому что количество фотографий изменилось между запросами. Shadwell
Я согласен, Шадвелл, вот почему я прокомментировал: «Это не идеальное решение, а просто обходной путь для ваших конкретных потребностей» и одна из лучших причин, почему это не имеет смысла в will_paginate. Если вам нужна такая функция, вы должны закодировать ее так, чтобы она наилучшим образом соответствовала вашему приложению и требованиям. Simone Carletti
0

одержать 1, 10 или 100 страниц в зависимости от набора результатов и количества элементов на странице.

Любая ссылка «показать все фотографии» может содержать информацию о поиске и нумерации страниц, используя параметры GET, как вы описали. Либо сохраняйте и извлекайте файлы cookie, чтобы результаты поиска сохранялись до тех пор, пока пользователи не очистят или не выберут новый поиск.

Я видел, что многие сайты с фотографиями (например, deviantart.com) используют файлы cookie, чтобы позволить пользователям вернуться назад. collimarco
Проблема в том, что когда пользователь временно покидает страницу с фотографиями (например, чтобы изменить ее), а затем пытается вернуться обратно, чтобы показать все фотографии, он всегда возвращается на первую страницу :( Хотя я не думаю, что использование файлов cookie - это хорошая вещь для SEO. collimarco
@ collimarco Если вы хотите повторно использовать параметры поиска и нумерации страниц между запросами, вам нужно их где-то сохранить. Обычно для этого нужны куки. Не уверен, какое влияние это окажет на SEO. Terry G Lorber
0

will_paginate просто использует параметры строки запроса 'search_field' и 'page'; Вы можете извлечь их из хеша Rails params. Если вы отслеживаете тех, кто использует состояние сеанса, вы можете повторно применить их в своем коде контроллера, когда это необходимо.

Как именно вы будете управлять этим, будет зависеть от вашего приложения. В приложении, над которым я работаю, поток таков, что я могу различить общий контекст и контекст члена. Пользователь входит в контекст члена со страницы индекса # члена. Поэтому я просто устанавливаю session [: member_context] при входе в контекст члена; например в членах # редактировать. Затем в индексе members # у меня есть следующий код:

if session[:member_context]
  @search_field = session[:search_field]
  @page = session[:page]
  # toggle out of member context
  session[:member_context] = nil
else
  @search_field = params[:search_field]
  @page = params[:page]
  # record lastest search in case the user subsequently enters the member context
  session[:search_field] = @search_field
  session[:page] = @page
end
@members = Member.where(<use @search_field>).page(@page)
# and render ...

Это прекрасно работает в моем приложении.

Похожие вопросы