2012-12-28 7 views
5

Ho usato will_paginate gem per paginare la pagina indice del mio test_app. Mostra solo le aste elencate e corrispondente ad ogni asta c'è Modifica, Distruggi funzionalità. La mia impaginazione funziona bene. Ho 6 aste in totale elencate in una tabella e come ho messo per_page = 2, ci sono 3 pagine. Ma quando modifico & Aggiorna l'asta a pagina 2 o 3, si passa alla prima pagina dopo l'azione di aggiornamento. Voglio che rimanga sulla stessa pagina.Impaginazione in Rails - Reindirizza sempre alla 1a pagina dopo modifica/aggiorna un elemento appartenente alle altre pagine

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 %> 

mio modello - Auction.rb

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

mio 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

Si prega di suggerire una soluzione. Grazie.

+1

Non mettere urgente nei tuoi titoli – simonmorley

risposta

2

Nell'azione update, si ha l'id dell'asta, lì è possibile calcolare la pagina prevista n. di conseguenza e usare redirect_to @auction,:page=>page_no

o altrimenti si dovrà inviare il parametro page alla pagina di modifica dello spettacolo (quando modifica link viene cliccato) e poi l'azione di aggiornamento per utilizzare quella pagina non reindirizzare

+0

Come possiamo inviare la pagina no dallo spettacolo per modificare? possiamo usare la variabile di istanza? –

+1

Per questo dovresti modificare il link dei pulsanti di modifica e aggiungerlo a pageno come "edit_auction_path (auction,: page => pageno)' –

3

è necessario mantenere params [: pagina] in tutto le operazioni di modifica/aggiornamento e si fondono con la stringa di interrogazione

+0

Puoi per favore darmi una risposta chiara su come farlo –

+1

ad es. redirect_to @auction,: page => params [: page] – shweta

+0

Dove devo specificarlo? Sto usando il routing pieni di risorse. –

0

è possibile utilizzare il metodo total_pages sulla variabile di istanza che si sta utilizzando per l'impaginazione.

è possibile fare riferimento per i dettagli my answer

0

ho usato redirect_to: indietro e ha mantenuto la stessa pagina.

+1

Puoi fornire un esempio di codice? –

1

Ecco come dovrebbe apparire il tuo metodo di eliminazione su auctions_controller.rb se si desidera utilizzare solo: torna per il reindirizzamento:

# DELETE /auctions/1 
    # DELETE /auctions/1.json 
    def destroy 
    @auction.destroy 
    respond_to do |format| 
     format.html { redirect_to :back } 
     format.json { head :no_content } 
    end 
    end 
0

risposta in ritardo, ma è possibile verificare la presenza di request.referrer se disponibili prima di mostrare il reindirizzamento all'URL deafault utilizzando qualcosa di simile nella tua modifica, aggiornamento o distruggere le azioni :

def destroy 
    @post.destroy 
    respond_to do |format| 
     format.html { redirect_to (request.referrer || posts_url), notice: 'Post was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

Si può anche leggere come devise gioiello gestisce il reindirizzamento in this file here

1

Ecco la mia soluzione:

  1. Nella vostra pagina di indice che ha pulsante di modifica/aggiornamento (aggiungere pagina params)

    = link_to content_tag(:span, "", :class => "fa fa-edit") + t('btn.edit'), edit_bill_path(bill, page: params[:page] || 1), :class => "btn btn-warning" 
    
  2. In si forma (aggiungere Pagina campo nascosto)

    = f.input :page, as: :hidden, input_html: {value: params[:page]} 
    
  3. Nel controller (percorso di reindirizzamento personalizzato con parametri di pagina)

    redirect_to your_path(page: params[:your_form_name_instance][:page]), notice: t('messages.update') 
    
  4. Enjoy :)

0

ho trovato il modo migliore per farlo è utilizzare redirect_back in Rails 5+.

Esempio:

# DELETE /guests/1 
# DELETE /guests/1.json 
def destroy 
    @guest.destroy 
    respond_to do |format| 
    format.html { redirect_back(fallback_location: guests_url, notice: 'Guest was successfully destroyed.') } 
    format.json { head :no_content } 
    end 
end 

Fondamentalmente reindirizza al referrer che riferisce all'azione distruggere. Se non è presente alcun referrer, viene utilizzato fallback_location. Ad esempio, ho un unico modulo nella mia pagina indice che elenca i guest, e quando si fa clic sul pulsante destroy vengono reindirizzati alla pagina in cui sono elencati gli ospiti, incluso il parametro page!

Problemi correlati