• Inspiración
  • Tutoriales
  • Bootcamp

En1Mes

  • Inspiración
  • Tutoriales
  • Bootcamp

Tutorial de Infinite Scrolling en Rails

Infinite Scrolling en Rails

Infinite scrolling es una técnica que consiste que a medida te acerques al final de la página esta cargue nuevos datos y sirve para remplazar la componente típica de paginación, el si es recomendable implementarla o no en una página es un tema bien discutido en la internet, pero en este tutorial vamos a explicar como implementarla.

Paso 0: Setup

Partamos con una aplicación vacía de Ruby on Rails, y dentro haremos el scaffold del recurso Post que contendrán los campos title y content.

Paso 0.1: Desacoplar el index

En lugar de ocupar el archivo index creado por el scaffold vamos a ocupar una vista parcial que contenga la información de cada post, de esta forma vamos a poder hacer mucho más con menos código.

Así que crearemos la vista parcial _post.html.erb

<!— views/posts/_post.html.erb →
<%= div_for(post) do %>
 <h2><%= post.id %></h2>
 <h2><%= post.title %></h2>
 <p><%= post.content %></p>
<% end %>

Luego el archivo posts/index.html.erb queda de esta forma:

<div id="content">
 <%= render(partial: 'post', collection: @posts) %>
</div>

Paso 1: Instalar la gema Kaminari para la paginación

¿Por qué necesitamos una gema para la paginación?, La respuesta es simple, para escribir menos código, las gemas de paginación nos separan los resultados en grupos, dependiendo de la página, la página 0 (sin número) contiene los primeros x resultados, la segunda página (?page=2) contiene los segundos x resultados. El truco que haremos con infinite scrolling es ir llamando via AJAX a estas distintas páginas generadas por el paginador (Kaminari)

Para instalar la gema hay que abrir el gemfile y agregar la línea

gem 'kaminari'

Paso 2: Paginando

Para paginar tenemos que modificar el controller de posts para especificar que los resultados deben ser paginados, esto lo hacemos modificando el método index.

def index
 @posts = Post.page(params[:page]).per(5)
end

Paso 2.1 Link a la siguiente página

En la vista de posts simplemente haremos un link a la página siguiente, para eso ocuparemos el helper de rails url_for sólo especificando el query string page, o sea este método llamará a la misma página pero añadiendo ?page=2 (o 3, o 4, u otro valor dependiendo del caso)

<p id="view-more">
 <%= link_to('Ver Más', url_for(page: @posts.current_page + 1)) %>
</p>

Paso 3: Agregando datos

Hasta el momento nuestro sitio es un simple listado de posts páginado pero debería estar funcionando, para probarlo vamos a agregar datos ocupando el archivo seeds.rb y una gema espectacular para este propósito llamada Faker.

Paso 3.1: Agregar la gema Faker al gemfile y luego correr bundler

Paso 3.2: Agregar las siguientes líneas al archivo db/seeds.rb

50.times.each do |x| 
 Post.create(:title => Faker::Lorem.sentence, :content => Faker::Lorem.paragraph )
end

paso 3.3: Correr rake db:seeds

paso 3.4: Probar entrando a localhost:3000/posts y ver los resultados, hacer click en siguiente y ver que la paginación funciona.

Paso 4: Infinite Scrolling

Hay librerías que podemos descargarde infinite scrolling, pero con Jquery es posible hacer el efecto de forma sencilla en sólo un par de líneas de código, para hacerlo vamos a crear el archivo scrolling.js.coffee dentro de la carpeta app/assets/javascript

Dentro del archivo vamos a hacer la primera prueba

jQuery ->
 $(window).scroll ->
   if $(window).scrollTop() > $(document).height() — $(window).height() — 50
     alert("Final de la página")

al correr el sitio e ir al final de la página va a aparecer una alerta diciendo Final de la página, el valor -50 debera ser ajustado en casos especiales, como fixed footers que sean muy grandes.

Paso 4.2 Haciendo el llamado Ajax

Ahora vamos a ocupar la idea anterior pero cada vez que se llegue al final de la página vamos a cargar una página nueva con posts más antiguos, para eso el método $.getScript() de jquery a lo que el controller responderá con un archivo index.js.erb con los posts nuevos (al pedir un archivo javascript el controller devuelve lo pedido y lo ejecuta)

jQuery ->
 $(window).scroll ->
   url = $('#view-more a').attr('href')
   if url && $(window).scrollTop() > $(document).height() —    $(window).height() — 50
     $("#view-more").attr('href', '')
     $.getScript url

Lo último que falta es aprovechar el archivo javascript devuelto y utilizarlo para actualizar la página.

Paso 4.3 Cargando los posts.

El archivo devuelto, que todavía no hemos creado, es index.js.erb (siguiendo las convenciones de rails debe llamarse igual que el método), ahora creemos el archivo y dentro de el carguemos la vista parcial de post con la información de los nuevos post y actualizemos el link para que cargue posts aún más antiguos.

$('#content').append("<%= j render @posts %>");
$("#view-more").attr("href", "<%= j posts_path(page: @posts.current_page + 1) %>");

Y con eso logramos Infinite Scrolling

Happy Infinite Scrolling !!!

Paso 4.4 (Opcional, pero elegante): Removiendo el link al final del documento.

Para remover el link tenemos que saber si realemente estamos al final, para eso comparamos @posts.current_page == @posts.total_pages

$('#content').append("<%= j render @posts %>");
<% if @posts.current_page == @posts.total_pages %>
 $('#view-more').remove();
<% else %>
 $('#view-more').html("<%= j link_to('View More', url_for(page: @posts.current_page + 1)) %>");
<% end %>
Jan 3, 2015Gonzalo Sánchez
Share Button
  • El Autor
  • Últimos Posts

About Gonzalo Sánchez

Emprendedor lean, Ingeniero civil informático dedicado al desarrollo de una mejor web con ruby on rails. Fanático de los números y las métricas y por sobre todo fundador de en1mes.
  • Mostbet guncel giris: en guncel bahis secenekleri - May 8, 2025
  • Mostbet Casino: Your Oasis of Gaming Pleasure, Always - May 6, 2025
  • Bahis ve emsallar Most Bet ile - May 6, 2025
  • Mostbet Resmi Sitesi: Bahis Severlerin Tercihi - May 3, 2025
  • MostBet Rehberi: Bahis Dunyasinda Basariya Ulasmanin Yollari - May 2, 2025
  • Basarili Bir Bahis Deneyimi Icin Ipuclari Most bet Platformunda - April 30, 2025
  • Mostbet Giris 2025: Bahis Stratejileri ve Taktikler - April 28, 2025
  • Bahis Dunyasinda Guvende Kalmanin Yollari Mostbet ile - April 25, 2025
  • Mostbet yeni giris adresi olarak sadece internet sitesi - April 23, 2025
  • Bahis Dunyasinda MostBet ile Guvenli Adimlar Atin - April 22, 2025
10 years ago 4 Comments Ruby, Tutorialesajax, Ruby on Rails, Tutoriales132,978
"My Concerts Wishlist" ajax scaffold Ruby on Rails¿Como diseñar un buen Layout para tu página web?
You Might Also Like
 
Los 4 problemas más comunes al instalar temas de WordPress
 
Nitrous, rails en la nube
Comments: 4
  1. Alex
    10 years ago

    Wena! No me carga la alerta al final de la página. Según Sublime hay un error en scrolling.js.coffee en la línea del if:
    jQuery ->
    $(window).scroll ->
    if $(window).scrollTop() > $(document).height() — $(window).height() — 50
    alert("Final de la página")

    Puede haber un error de tipeo?

    ReplyCancel
    • Gonzalo Sánchez
      10 years ago

      las tabulaciones pueden ser.

      ReplyCancel
  2. Alex
    10 years ago

    Cambié la línea por

    if ($(window).scrollTop() >= ($(document).height() - $(window).height())*1)

    y funcionó

    ReplyCancel
  3. Alex
    10 years ago

    Estoy casi... me carga 10 posts con infinite pero al seguir haciendo scroll vuelve al número 6, o sea, me muestra un scroll infinito de los números 6 al 10 infinitamente. Nunca aparecen los posts del 11 al 50.

    ReplyCancel

Leave a Reply to Alex Cancel reply

Tags
mostbetslotticamostbet UZslottica PLRuby on Railsaviatoraviator KZozwincasinoozwincasino AUemprendimientos digitalesfortunetiger BRfortunetigerTutorialesDiseñoLondonLondon UZbj88slottica BRHerramientashtml5WordpressrubyLanding Pageparty poker casinogratogana juegos en vivoแทงบอลออนไลน์Bases de datoswash serviceหวยออนไลน์gratogana entrar20bet plkudos casino no deposit bonus 2024kudos casino loginTallereshackathonkudos casino no deposit bonuspartycasino entrarHeroku1win AZ1winTipsPáginas WebNitrousInspiracióncbd
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • Interesado en otros tipos de emprendimiento?

    Quieres aprender a importar y exportar productos a todo el mundo? entra aquí

  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • No te pierdas ningún artículo.

  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • 2016 © En 1 Mes