2011-01-22 15 views
30

W moim kontrolerze konta chciałbym wyświetlić (renderować, przekierować do?) Widok edycji po zapisaniu zmian i wyświetleniu powiadomienia flash.Jak renderować widok edycji i publikować wiadomość flash w szynach3

def update 
    @account = Account.find(params[:id]) 

    respond_to do |format| 
     if @account.update_attributes(params[:account]) 
     format.html { redirect_to(@account, :notice => 'Account was successfully updated.') } 

     else 
     format.html { render :action => "edit" } 
     end 
    end 
    end 

Odpowiedz

11

Można nadal używać powiadomień jak w Rails 2:

flash[:notice] = "message" 

Wystarczy dodać następującą linię do góry widoku, aby go wyświetlić:

<p id="notice"><%= flash[:notice] %></p>

a ty należy użyć metody render, jeśli nie chcesz, aby użytkownicy ponownie wypełniali formularze edycyjne.

+0

Nie rozumiem twój ostatni komentarz. Standardowym jest "redirect_to" po aktualizacji, więc odświeżanie przeglądarki nie jest wysyłane po raz drugi. "Wpełnij ponownie edycje formularzy" wprawia mnie w zakłopotanie. – timkay

+0

Właściwie to był mój błąd, w twoim przypadku nie ma żadnej różnicy między tymi metodami. Więc używaj tego, co chcesz. –

+0

@timkay, ale nie zapominaj, że 'render' i' redirect_to' są całkowicie deferentnymi metodami. Przeczytaj [Poradniki Railsów na temat renderowania] (http://guides.rubyonrails.org/layouts_and_rendering.html), aby uzyskać więcej informacji. –

43

Domyślnie musisz użyć osobnej instrukcji, np.

format.html { 
    flash[:notice] = 'message' 
    render :edit 
} 

This ticket ma łatę, aby móc skorzystać render 'edit', :notice => 'message'. Nie dostał się do Railsów, ale jest klejnot, flash_render, który go dodaje.

+1

Jeśli używasz 'render' (w przeciwieństwie do' redirect_to'), zazwyczaj chcesz użyć 'flash.now'. Wyjaśnię, dlaczego szczegółowo [w tym poście na blogu] (http://ryanlue.com/posts/2017-08-24-rails-render#implications-for-flash). –

9

Jeśli po prostu użyjesz flash[:notice], ta wartość będzie nadal dostępna w następnym żądaniu. Oznacza to, że tekst pojawi się na następnych 2 stronach. Zamiast tego użyj wartości flash.now, aby udostępnić wartość tylko w bieżącym żądaniu.

format.html { 
    flash.now[:notice] = 'message' 
    render :edit 
} 

Dla porównania czytać Action Controller Overview 5.2.1

Powiązane problemy