Как использовать гем will_paginate с Sinatra и Sequel

Я пытаюсь использовать гем will_paginate для разбиения на страницы своих сообщений в блоге, я также использую Sinatra и Sequel для блога. Я получаю сообщение об ошибке

"undefined method `paginate'"

И я пробовал все, чтобы заставить его работать, но это всегда одна и та же ошибка.

page = params.fetch "page", 1
per_page = params.fetch "per_page", 3
@posts = Post.order(:id).paginate(page.to_i,per_page.to_i)

or

@posts = Post.paginate(:page => params[:page])

Оба выдают одну и ту же ошибку независимо от того, какой запрос я предоставляю.

Есть ли способ заставить это работать, или есть ли другой способ, чтобы я мог разбивать свои сообщения на страницы с помощью Sequel и Sinatra?


person uklp    schedule 20.11.2013    source источник


Ответы (1)


Не связано конкретно с Sequel, но вы можете разбить любую коллекцию на страницы (даже те, с которыми will_paginate не интегрируется по умолчанию), используя это:

require 'will_paginate/collection'
paged_collection =
  WillPaginate::Collection.create(page, per_page, total_count) do |pager|
    pager.replace(collection)
  end

ИЗМЕНИТЬ:

Попробуй это:

require 'will_paginate'
require 'will_paginate/sequel'
require 'sequel/extensions/pagination'

page = params.fetch "page", 1
per_page = params.fetch "per_page", 3
@posts = Post.order(:id).extension(:pagination).paginate(page.to_i,per_page.to_i)
person Amadan    schedule 20.11.2013
comment
Я новичок в Ruby в целом, это мой первый проект с ним. Так можно поконкретнее пожалуйста? .. я могу отправить вам свой код и попытаться сделать это вместе ... - person uklp; 20.11.2013
comment
Более конкретно? Это в значительной степени plug-and-play. Поставьте Post.order(:id) вместо collection, to_i то, что у вас есть для to_i, и замените paged_collection на @posts. Если вы не знаете total_count, можете не указывать. Где конкретно у вас проблема? - person Amadan; 20.11.2013
comment
Итак, после того, как я объявлю «страницу» и «на_страницу», как я сделал в основном вопросе (я опускаю total_count), и я пишу - @posts = WillPaginate::Collection.create(page, per_page) do |pager|, pager .replace(Post.order(:id)), end - я получаю сообщение об ошибке, указывающее на отсутствие неявного преобразования Sequel::SQLite::Dataset в Array ..ps СПАСИБО ЗА ТЕРПЕНИЕ - person uklp; 20.11.2013
comment
Хорошо, после небольшого дополнительного исследования Sequel кажется: а) ваш код на самом деле не возвращает строки, и б) will_paginate действительно поддерживает Sequel, так что ... я обновлю ответ. - person Amadan; 20.11.2013
comment
Я не мог проверить это до сих пор. И ДА, кажется, что сообщения разбиваются на страницы. Но у меня есть еще одна проблема, например, у меня есть 9 сообщений, и я заставляю их показывать по 3 на странице, как в примере, так где же находятся остальные 6 сообщений, какой URL-адрес для их просмотра сейчас? ..СПАСИБО за всю вашу помощь, вы действительно помогаете. - person uklp; 20.11.2013
comment
Ссылки на страницы создаются <%= will_paginate @posts %> (в ERB или = will_paginate @posts в HAML...) - person Amadan; 20.11.2013
comment
хм, еще кое-что. Я сделал весь код разбивки на страницы в основном маршруте ( '/' ), и после того, как я поместил код ссылки на страницы, указанный в вашем комментарии, все работает, за исключением того, что всякий раз, когда я пытаюсь получить доступ к любому другому маршруту, я получаю сообщение об ошибке с указанием неопределенного метода ` total_pages' для nil:NilClass .Я сейчас не понимаю ?? - person uklp; 20.11.2013
comment
Хм, сейчас не могу проверить, а в документах сказано, что total_pages (третий аргумент paginate) необязателен... Или подождите, это работает для одного маршрута, а не для других? Вы пытаетесь will_paginate в представлении, вызванном из маршрута, который не устанавливает @posts? - person Amadan; 21.11.2013
comment
Извините за задержку, меня не было рядом.. я просто поставил will_paginate в представление, которое отображало каждый пост в представлении, а не в layout.erb, и все прошло нормально.. БОЛЬШОЕ СПАСИБО ЗА ВАШУ ПОМОЩЬ! - person uklp; 25.11.2013