2012-12-28 13 views
5

Użyłem gem będzie_paginate gem dla strony indeksowania stron mojej test_app. Pokazuje tylko listę aukcji i odpowiada każdej aukcji, która zawiera funkcje Edytuj, Zniszcz. Moja paginacja działa dobrze. Mam łącznie 6 aukcji w formie tabelarycznej i jako że umieszczam per_page = 2, są tam 3 strony. Ale kiedy edytuję & Zaktualizuj aukcję na stronie 2 lub 3, po prostu przejdzie na pierwszą stronę po akcji aktualizacji. Chcę, żeby to pozostało na tej samej stronie.Paginacja w Railsach - Zawsze przekierowuje na 1. stronę po edycji/aktualizacji elementu należącego do innych stron.

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

moim modelu - Auction.rb

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

Moja 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

Proszę zaproponować rozwiązanie. Dziękuję Ci.

+1

Nie umieszczaj pilnie w swoich tytułach. – simonmorley

Odpowiedz

2

W swojej akcji update masz identyfikator aukcji, możesz tam obliczyć oczekiwaną stronę nr. odpowiednio i użyć redirect_to @auction,:page=>page_no

czy inaczej trzeba by wysłać parametr do strony edycji page z show (gdy edit kliknięciu łącza), a następnie do akcji aktualizacji użyć tej strony nie przekierować

+0

Jak możemy wysłać page_no z show do edycji? czy możemy użyć zmiennej instancji? –

+1

W tym celu należy zmodyfikować link do przycisków edycji i dodać do niego słowo pageno jako "ścieżka_instrukcji_edukcji (aukcja,: strona => pageno)" –

3

trzeba zachować params [: strona] całej operacji/update edycyjnych i połączyć go z łańcucha zapytania

+0

Czy możesz dać mi jasną odpowiedź, w jaki sposób można to zrobić –

+1

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

+0

Gdzie muszę to określić? Używam zaradnego routingu. –

0

można użyć metody TOTAL_PAGES na zmiennej instancji, które używasz do paginacji.

można odnieść my answer szczegółowe informacje

0

użyłem redirect_to: z powrotem i utrzymuje tę samą stronę.

+1

Czy możesz podać przykład kodu? –

1

Oto, jak powinna wyglądać Twoja metoda usuwania w kontrolerach auctions_controller.rb jeśli chcesz po prostu użyć: Back for przekierowania:

# 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

Późne odpowiedź, ale można sprawdzić request.referrer jeśli jego dostępne przed pokazaniem przekierowanie na url deafault pomocą czegoś takiego w swojej edycji, aktualizacji lub zniszczyć działań :

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 

można też przeczytać, jak devise gem obsługuje przekierowania w this file here

1

Oto moje rozwiązanie:

  1. W swojej strony indeksu, który ma przycisk Edycja/Update (dodaj stronę 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. W ty tworzą (dodaj ukrytą stronę pola)

    = f.input :page, as: :hidden, input_html: {value: params[:page]} 
    
  3. W kontrolerze (niestandardowa ścieżka przekierowania z parametrami stron)

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

0

mogę znaleźć najlepszy sposób, aby to zrobić jest wykorzystanie redirect_back w Rails 5+.

Przykład:

# 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 

zasadzie to przekierowuje do polecający, który odnosił się do akcji zniszczyć. Jeśli nie ma strony odsyłającej, używana jest strona odsyłająca fallback_location. Na przykład mam formularz z jednym przyciskiem na mojej stronie indeksu, który zawiera listę gości, a po kliknięciu przycisku "Niszczenie" przekierowuję z powrotem na stronę, na której znajdują się goście, łącznie z parametrem page!

Powiązane problemy