Página do item e Will_Paginate
-
21-08-2019 - |
Pergunta
Tenho algumas fotos divididas em páginas sucessivas através do plug -in Will_Paginate. Quando você abre uma foto e depois retorna a todas as fotos usando um link, você sempre retorna à primeira página (por exemplo, a foto é exibida na página 5, você abre a foto, clica em um link para mostrar todas as fotos e esperar que você esteja ligado página 5 novamente, mas você está na página 1).
Agora, existe algum método para obter o número da página ao qual uma foto pertence?
Tentei passar um parâmetro GET, mas isso só funciona se o usuário não executar mais ações (por exemplo, postar um comentário, editar foto, ecc.).
Solução
page = (number_of_records_before_RECORD / number_of_records_per_page) + 1
Em outras palavras. Se sua foto tiver 40 anos e há 25 registros antes (assumindo que alguns registros foram excluídos), com 20 registros por página:
page = (25 / 20) + 1 = 2
Você pode contar o número de registros antes do registro selecionado usando Model.count(:conditions => ['id < ?', record.id], :order => 'id')
. A consulta certa depende de qual filtro de classificação você aplica a essa tabela ao listar todos os objetos.
Outras dicas
O número da página é altamente dependente dos resultados da sua pesquisa. Sua pesquisa pode ter 1, 10 ou 100 páginas, dependendo do conjunto de resultados e do número de itens por página.
Qualquer link para "Mostrar todas as fotos" pode conter as informações de pesquisa e paginação, usando os parâmetros GET como você descreveu. Ou armazenar e recuperar através de um cookie para que os resultados da pesquisa persistam até que os usuários limpem ou selecionem uma nova pesquisa.
Aqui está outra solução: Will_Paginate apenas usa parâmetros de sequência de consulta 'Search_field' e 'página'; Você pode extraí -los do hash dos parâmetros de trilhos. Se você acompanhar os que usam o estado da sessão, poderá aplicá -los novamente no código do seu controlador, quando necessário.
Exatamente como você gerencia isso dependerá do seu aplicativo. No aplicativo em que estou trabalhando, o fluxo é tal que posso distinguir entre um contexto geral e um contexto de membro. O usuário insere o contexto do membro na página de índice#do membro. Então, acabei de definir sessão [: membro_context] na entrada no contexto do membro; por exemplo, em membros#editar. Então, no índice dos membros#, tenho o seguinte código:
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 ...
Isso funciona muito bem na minha aplicação.