2011-01-22 9 views
30

Nel mio controller di account, vorrei mostrare (rendering, redirect_to?) La vista di modifica dopo aver salvato le modifiche e visualizzato il flash notice.Come rendere la vista di modifica e il messaggio flash in binari3

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 

risposta

11

è comunque possibile utilizzare le comunicazioni come in Rails 2:

flash[:notice] = "message" 

Basta aggiungere la seguente riga alla parte superiore di immagine per visualizzarla:

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

E voi dovrebbe utilizzare il metodo render se non si desidera che gli utenti riempiano nuovamente i moduli di modifica.

+0

Non capisco il tuo ultimo commento. È standard per "redirect_to" dopo un aggiornamento, in modo che l'aggiornamento del browser non venga inviato una seconda volta. La parte "riempi i moduli di modifica ancora una volta" mi confonde. – timkay

+0

In realtà quello è stato un mio errore, nel tuo caso non c'è davvero alcuna differenza tra questi metodi. Quindi usa quello che vuoi. –

+0

@timkay ma non dimenticare che 'render' e' redirect_to' sono metodi completamente differiti. Leggi [Rails Guides on Rendering] (http://guides.rubyonrails.org/layouts_and_rendering.html) per maggiori informazioni. –

43

Per impostazione predefinita è necessario utilizzare un'istruzione separata, ad es.

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

This ticket ha una patch per consentire di utilizzare render 'edit', :notice => 'message'. Non è entrato in Rails ma c'è un gioiello, flash_render, che lo aggiunge.

+1

Se stai usando 'render' (al contrario di' redirect_to'), generalmente vuoi usare 'flash.now'. Spiego perché in dettaglio in [questo post del blog] (http://ryanlue.com/posts/2017-08-24-rails-render#implications-for-flash). –

9

Se si utilizza solo flash[:notice] tale valore sarà ancora disponibile nella richiesta successiva. Significato, vedrai il testo nelle prossime 2 pagine. Utilizzare invece flash.now per rendere solo il valore disponibile nella richiesta corrente.

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

Per riferimento leggere Action Controller Overview 5.2.1

Problemi correlati