2009-06-30 18 views
7

Tengo algunas fotos que se dividen en páginas sucesivas a través del plugin will_paginate. Cuando abre una foto y luego regresa a todas las fotos usando un enlace, siempre regresa a la primera página (por ejemplo, la foto se muestra en la página 5, abre la foto, hace clic en un enlace para mostrar todas las fotos y espera estar en ella página 5 otra vez, pero estás en la página 1).Página del artículo y will_paginate

Ahora, ¿hay algún método para obtener el número de página al que pertenece una fotografía?

Intenté pasar un parámetro GET, pero esto solo funciona si el usuario no realiza más acciones (por ejemplo, publicar un comentario, editar una foto, etc.).

Respuesta

8
page = (number_of_records_before_RECORD/number_of_records_per_page) + 1 

En otras palabras. Si una fotografía tiene ID 40 y hay 25 registros antes (suponiendo que algunos registros se han eliminado), con 20 registros por página:

page = (25/20) + 1 = 2 

Se puede contar el número de registros antes de que el registro seleccionado usando Model.count(:conditions => ['id < ?', record.id], :order => 'id'). La consulta correcta depende del filtro de clasificación que aplique a esa tabla cuando se enumeren todos los objetos.

+0

Esto puede ser una solución, pero me pregunto por qué este código no se implementa por defecto en el complemento. Tal vez porque no tiene sentido hacer lo que dije en términos de rendimiento. – collimarco

+0

Becau esto realmente no tiene sentido para una audiencia amplia. Esta no es una solución perfecta, sino solo una solución para su necesidad específica. Además, will_paginate proporcionará servicios de paginación, no funcionalidades adicionales de ActiveRecord. –

+1

No hubiera pensado que sería un gran golpe de rendimiento. Cuando usa una biblioteca de paginación contará todas las cosas que está buscando para obtener el recuento total de páginas.Siempre que la columna que está ordenando esté indexada correctamente, no debería ser demasiado doloroso obtener un conteo similar para encontrar la página actual. – Shadwell

0

El número de página depende en gran medida de los resultados de su búsqueda. Su búsqueda puede tener 1, 10 o 100 páginas, dependiendo del conjunto de resultados y la cantidad de elementos por página.

Cualquier enlace para "mostrar todas las fotos" podría contener la información de búsqueda y paginación, utilizando los parámetros GET que usted ha descrito. O almacenar y recuperar a través de una cookie para que los resultados de búsqueda persistan hasta que los usuarios borren o seleccionen una nueva búsqueda.

+0

El problema es que cuando el usuario deja temporalmente la página de la foto (por ejemplo para modificarla) y luego intenta volver para mostrar todas las fotos, siempre vuelve a la primera página :( Aunque no creo cookies es bueno para SEO. – collimarco

+1

@collimarco Si desea reutilizar los parámetros de búsqueda y de paginación entre las solicitudes, deberá persistir en algún lugar. Para eso suelen ser las cookies. No estoy seguro del impacto que esto tendría en SEO –

+0

Vi que muchos sitios de fotografía (como deviantart.com) usan cookies para permitir que los usuarios regresen. – collimarco

0

Aquí hay otra solución: will_paginate solo usa los parámetros de cadena de búsqueda 'search_field' y 'page'; puede extraerlos del hash Rails params. Si realiza un seguimiento de aquellos que usan el estado de la sesión, puede volver a aplicarlos en su código de controlador, cuando sea necesario.

Exactamente cómo lo gestiones dependerá de tu aplicación. En la aplicación en la que estoy trabajando, el flujo es tal que puedo distinguir entre un contexto general y un contexto miembro. El usuario ingresa el contexto de miembro desde la página de índice de miembro #. Así que acabo de establecer session [: member_context] en la entrada al contexto miembro; p.ej. en miembros # edit. Luego, en el índice de miembros #, tengo el siguiente 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 ... 

Esto funciona muy bien en mi solicitud.

Cuestiones relacionadas