Как увидеть результаты пейджинга с Sequel и Sinatra

Я использую will_paginate и пытаюсь просмотреть набор данных из Sequel. Требования:

require 'will_paginate'
require 'will_paginate/sequel'
require 'will_paginate/collection'
require 'will_paginate/version'
require 'sequel/extensions/pagination'

Код Руби:

get '/candidate' do
     @items = DB[:candidates].order(:id).extension(:pagination).paginate(1, 10)
     erb :candidate
end

В поле зрения: <%= will_paginate @items %>

Набор данных правильно отображается с 10 записями, и когда я нажимаю «2» или «Далее», адрес в браузере меняется на http://localhost:4567/candidate?page=2, но записи остаются прежними. По сути, результаты не выводятся на страницы, и я не могу пройти дальше страницы 1.


person user1903663    schedule 06.06.2013    source источник


Ответы (1)


Числа для страницы и количество записей жестко закодированы в вашем примере с использованием paginate(1, 10), поэтому он всегда будет возвращать страницу 1 с 10 записями. Вам нужно передать параметр page=2 из строки запроса. Это делается с помощью params помощника:

get '/candidate' do
  @items = DB[:candidates].order(:id).paginate(:page => params["page"].to_i, :per_page => 10)
  erb :candidate
end

Если вы хотите, вы также можете передать per_page в строке запроса, добавив этот код:

get '/candidate' do
   @items = DB[:candidates].order(:id).paginate(:page => params["page"].to_i, :per_page => params["per_page"].to_i)
   erb :candidate
end

Я бы добавил значение по умолчанию для обоих, если они не заданы. Я понимаю, что вы можете сделать это через библиотеку, например. WillPaginate.per_page = 10, но вы также можете сделать это в маршруте через:

get '/candidate' do
  page = params.fetch "page", 1
  per_page = params.fetch "per_page", 10
  @items = DB[:candidates].order(:id).paginate(:page => page.to_i, :per_page => per_page.to_i)
  erb :candidate
end

Я не замечал, прежде чем вы также использовали помощник Sinatra, предоставленный will_paginate.

Я бы либо вызвал paginate для набора данных или получил набор данных без разбивки на страницы и передал его помощнику. Итак, либо это:

get '/candidate' do
  page = params.fetch "page", 1
  per_page = params.fetch "per_page", 10
  @items = DB[:candidates].order(:id).paginate(:page => page.to_i, :per_page => per_page.to_i)
  erb :candidate
end

# in the view
<%= @items %>

или это:

get '/candidate' do
  @items = DB[:candidates].order(:id)
  erb :candidate
end

# in the view
<%= will_paginate @items, params %>

Итак, из того, что я вижу, метод Sequel paginate не перезаписывается, не обертывается/не перегружается, поэтому его сигнатура метода такая же, как если бы вы использовали Sequel, а не will_paginate. Это означает, что этот код работал для меня:

require 'will_paginate'
require 'will_paginate/sequel'
get '/candidate' do
  page = params.fetch "page", 1
  per_page = params.fetch "per_page", 10
  @items = Repo.db[:candidates].order(:id).paginate(page.to_i, per_page.to_i)
  haml :candidate
end

В представлении Haml:

- @items.each do |i|
  = i[:title]

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

person iain    schedule 06.06.2013
comment
Большое спасибо за ваше предложение. К сожалению, это не работает, сообщение об ошибке: ArgumentError at /candidate неправильное количество аргументов (1 из 2) файл: pagination.rb расположение: строка paginate: 26 У меня было это раньше с моими различными экспериментами, я просто не могу понять это . - person user1903663; 06.06.2013
comment
@ user1903663 К сожалению, в этом файле всего 25 строк! Убери .extension(:pagination), он не нужен, посмотри, поможет ли. например @items = DB[:candidates].order(:id).paginate(:page => page, :per_page => per_page). - person iain; 06.06.2013
comment
извините за полную боль, но все равно ничего хорошего. На этот раз ошибка: неправильное количество аргументов (1 из 2) файл: pagination.rb - фактически такое же сообщение об ошибке. расположение: строка страницы: 26 - person user1903663; 06.06.2013
comment
@user1903663 user1903663 Добавьте свои версии Ruby, Sequel, Sinatra и will_paginate к вопросу, и я посмотрю, смогу ли я воссоздать его. - person iain; 06.06.2013
comment
@user1903663 user1903663 Я также заметил кое-что в вопросе, я добавил его в редактирование ответа. - person iain; 06.06.2013
comment
спасибо, извините за задержку. ruby 1.9.3p392 (22 февраля 2013 г., редакция 39386) [i686-linux], продолжение 3.48.0, Sinatra/1.4.2 - person user1903663; 09.06.2013
comment
Спасибо, я пробовал (все) выше, и ничего не работает. Последнее предложение производит: неопределенный метод `total_pages' для #‹Sequel::Postgres::Dataset:0x8c8ea08› - person user1903663; 09.06.2013
comment
Однако мне удалось заставить пейджинг работать с активной записью, но теперь я не могу выполнять запросы на соединение с активной записью, поэтому у меня возникла абсурдная ситуация, когда я использую активную запись для пейджинга и продолжение для всего остального. Разговор о шизофрении! Поэтому ваша помощь все еще нужна. - person user1903663; 09.06.2013
comment
@user1903663 user1903663 Да, это, безусловно, скоро запутает! Какая версия will_paginate? Я видел эта ошибка и, может быть, она связана? - person iain; 09.06.2013
comment
will_paginate 3.0.4, большое спасибо и удачи, да, я тоже видел сообщение об ошибке выше, боюсь, это не поможет. - person user1903663; 10.06.2013
comment
@user1903663 user1903663 Я обновил ответ тем, что сработало для меня. Надеюсь, поможет. - person iain; 11.06.2013
comment
Ян, спасибо за всю вашу работу над этим. В то время как ваше решение дает мне отображаемую страницу с десятью строками, когда я нажимаю на страницу 2, я все еще получаю ошибку, которая мучила меня раньше, а именно: неопределенный метод `-' для 2: String ... О боже. Я пока продолжу использовать как активную запись, так и сиквел, что нелепо, но ... - person user1903663; 11.06.2013
comment
@user1903663 user1903663 Вы изменили Haml, который я дал ERB? Я должен был использовать ERB, приношу свои извинения, я сам им не пользуюсь и, должно быть, был на автопилоте. - person iain; 11.06.2013
comment
Я поменял на erb, спасибо. Но все же это работает. Я получаю первую страницу, но последующие клики на следующую страницу (страницы) приводят к ошибке. Я все еще хочу найти решение, поскольку я не хочу продолжать использовать Active Record и Sequel вместе. - person user1903663; 17.06.2013
comment
да, неопределенный метод `-' для 2:String - person user1903663; 19.06.2013
comment
@user1903663 user1903663 А, я понял (ответ после кофе помогает :) Все параметры строки запроса возвращаются в виде строк, поэтому вам нужно преобразовать числа в целые числа и т. д. Первая страница работает, потому что вы не отправляете параметры для первой страница, и она использует значение по умолчанию. Попробуйте ….paginate(page.to_i, per_page.to_i) и посмотрите, исправит ли это проблему. - person iain; 19.06.2013
comment
ФАНТАСТИЧЕСКИЙ, вы ученый и джентльмен. благодарю вас. Работает отлично. Вот так: page = params.fetch page, 1 per_page = params.fetch per_page, 10 @items = DB[:candidates].order(:id).paginate(page.to_i, per_page.to_i) Я поставил галочку . Большое спасибо. - person user1903663; 20.06.2013
comment
@ user1903663 Рад, что смог помочь. Я также обновил ответ, если у кого-то еще возникнет такая же проблема, ему не придется читать все наши комментарии! :) - person iain; 20.06.2013