Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pagination in Rails - Always redirects to 1st page after edit/update an element belonging to the other pages

I have used will_paginate gem for paginating index page of my test_app. It just shows the auctions listed and corresponding to each auction there is Edit, Destroy functionalities. My pagination is working good. I have 6 auctions in total listed in a table manner and as I put per_page = 2, 3 pages are there. But when I edit & Update the Auction in page 2 or 3, it just goes to 1st page after update action. I want that to stay on the same page.

My View - Index.html.erb

<h1>Listing auctions</h1>

<table>
  <tr>
    <th>Name</th>
    <th>Category</th>
    <th>Item</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @auctions.each do |auction| %>
  <tr>
    <td><%= auction.name %></td>
    <td><%= auction.category %></td>
    <td><%= auction.item_id %></td>
    <td><%= link_to 'Show', auction %></td>
    <td><%= link_to 'Edit', edit_auction_path(auction) %></td>
    <td><%= link_to 'Destroy', auction, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>
</table>

<br />
<%= will_paginate @auctions %>
<%= link_to 'New Auction', new_auction_path %>
<%= link_to 'Back to Home', home_path %>

My Model - Auction.rb

class Auction < ActiveRecord::Base
  attr_accessible :name, :category, :item_id
  self.per_page = 2
end

My Controller - auctions_controller.rb

class AuctionsController < ApplicationController
  # GET /auctions
  # GET /auctions.json
  def index
    @auctions = Auction.paginate(:page => params[:page])#pagination for Index
    #@posts = Post.paginate(:page => params[:page])
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @auctions }
    end
  end

  # GET /auctions/1
  # GET /auctions/1.json
  def show
    @auction = Auction.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @auction }
    end
  end

  # GET /auctions/new
  # GET /auctions/new.json
  def new
    @auction = Auction.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @auction }
    end
  end

  # GET /auctions/1/edit
  def edit
    @auction = Auction.find(params[:id])
  end

  # POST /auctions
  # POST /auctions.json
  def create
    @auction = Auction.new(params[:auction])

    respond_to do |format|
      if @auction.save
        format.html { redirect_to @auction, notice: 'Auction was successfully created.' }
        format.json { render json: @auction, status: :created, location: @auction }
      else
        format.html { render action: "new" }
        format.json { render json: @auction.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /auctions/1
  # PUT /auctions/1.json
  def update
    @auction = Auction.find(params[:id])

    respond_to do |format|
      if @auction.update_attributes(params[:auction])
        format.html { redirect_to @auction, notice: 'Auction was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @auction.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /auctions/1
  # DELETE /auctions/1.json
  def destroy
    @auction = Auction.find(params[:id])
    @auction.destroy

    respond_to do |format|
      format.html { redirect_to auctions_url }
      format.json { head :no_content }
    end
  end
end

enter image description here

Please suggest a solution. Thank you.

like image 956
Rajesh Omanakuttan Avatar asked Dec 28 '12 04:12

Rajesh Omanakuttan


2 Answers

You need to retain params[:page] throughout edit/update operations and merge it with your query string

like image 129
shweta Avatar answered Nov 15 '22 03:11

shweta


In your update action, you have the auction id, there you can calculate the expected page no. accordingly and use redirect_to @auction,:page=>page_no

or otherwise you would have to send the page parameter to the edit page from the show(when edit link is clicked) and then to the update action to use that page no to redirect

like image 20
Rahul garg Avatar answered Nov 15 '22 03:11

Rahul garg