Render parcial con mostrador de colección y pantalla para cada objeto con Pagy Gem

Quiero mostrar el índice de cada registro en una colección cuando se hace en mi aplicación de ferrocarriles.

Por ejemplo: Nombre, 1 Nombre, 2 Nombre, 3. ...

Uso el índice oculto incorporado para lograr esto hoy, pero después de añadir paginación con la gema Pagy el índice se reinicia cada vez que voy a una página nueva. Así que si exhibo 20 registros por página, el primer índice en la página 2 debe ser 21, pero actualmente muestra 1.

Aquí está mi código:

team_controller.rb

def index
if params[:query]
  @pagy, @teams = pagy(Team.includes(:stadium).global_search(params[:query]))
else
  @pagy, @teams = pagy(Team.order_by_score)
end
end

index.html.erb

<%= render partial: "teams/card", collection: @teams, as: 'team' %>

en mi parcial.html.erb

<%= team_counter +1   %>

¿Alguna idea de cómo puedo mostrar el índice de cada registro sin tener que reiniciar en cada página?

Cualquier cosa que pudiera ayudarme sería muy apreciada.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por byteexplorer


3 Respuestas:

  • @pagy.offset devuelve el offset de la página actual que puede pasar a with_index para calcular el índice correcto de un registro.

    <% @teams.each.with_index(@pagy.offset) do |team, index| %>
      <%= render partial: "teams/card", team: team, index: index %>
    <% end %>
    

    y mostrar el índice en su teams/card parcial como este:

    <%= index %>
    

    Cuando quieras que tu índice comience desde 1 en lugar de 0 sólo cambiar with_index(@pagy.offset) a with_index(@pagy.offset + 1) en el ejemplo anterior.

    Respondida el Dec 19, 2020 a las 13:55 - por bytebuster

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando se debe a que el índice que estás mostrando se basa en el contador team_counter, pero al usar la paginación con la gema Pagy, se está reiniciando en cada página nueva. Para solucionar este problema y mostrar un índice continuo sin reiniciar en cada página, puedes calcular el índice de cada registro en función de la página actual y la cantidad de registros por página.

    Aquí te dejo un ejemplo de cómo podrías modificar tu código para lograr esto:

    En tu controlador team_controller.rb, puedes actualizar la lógica de la siguiente manera:

    ruby
    def index
      if params[:query]
        @pagy, @teams = pagy(Team.includes(:stadium).global_search(params[:query))
      else
        @pagy, @teams = pagy(Team.order_by_score)
      end
      @teams_index_start = @pagy.offset + 1
    end
    

    En tu vista index.html.erb, puedes utilizar este índice calculado para mostrar el número de índice continuo:

    erb
    <% @teams.each_with_index do |team, index| %>
      <%= @teams_index_start + index %>. <%= render partial: "teams/card", locals: { team: team } %>
    <% end %>
    

    De esta forma, cada página mostrará el índice continuo en función de la cantidad de registros por página y la página actual. Espero que esta solución te ayude a resolver tu problema. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 20, 2020 a las 13:59 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para mostrar el índice de cada registro en una colección con Pagy Gem y hacer que el índice continúe en las páginas siguientes, puedes usar la función pagy_get_vars. Esta función devuelve un hash de variables que se pueden utilizar para acceder a información sobre la colección paginada actual.

    Aquí tienes un ejemplo modificado de tu código que utiliza pagy_get_vars para mostrar el índice correcto de cada registro:

    team_controller.rb:

    ruby
    def index
      if params[:query]
        @pagy, @teams = pagy(Team.includes(:stadium).global_search(params[:query]))
      else
        @pagy, @teams = pagy(Team.order_by_score)
      end
    end
    

    index.html.erb:

    html
    <%= render partial: "teams/card", collection: @teams, as: 'team' %>
    

    _card.html.erb:

    html
    <% pagy_get_vars(@teams, :page).each_with_index do |(key, value), index| %>
      <%= index + 1 %>
    <% end %>
    

    En el parcial _card.html.erb, utilizamos pagy_get_vars(@teams, :page) para obtener un hash de variables de paginación. Luego, recorremos este hash y utilizamos el índice para mostrar el índice correcto de cada registro.

    De esta manera, el índice de cada registro continuará en las páginas siguientes, incluso después de haber añadido la paginación con Pagy Gem.

    Respondida el Dec 20, 2020 a las 14:03 - por Gemini

    Votos positivos: 0 | Votos negativos: 0