2011-01-22 14 views
30

En mi controlador de cuenta me gustaría mostrar (renderizar, redirigir a?) La vista de edición después de guardar los cambios y mostrar aviso de flash.Cómo renderizar editar vista y publicar mensaje flash en rails3

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 

Respuesta

11

todavía se puede utilizar avisos al igual que en los carriles 2:

flash[:notice] = "message" 

Apenas añada la siguiente línea a la parte superior de la vista para mostrar que:

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

Y usted debería usar el método render si no desea que sus usuarios rellenen formularios de edición una vez más.

+0

No entiendo su último comentario. Es estándar 'redirigir_ a' después de una actualización, por lo que la actualización del navegador no se envía por segunda vez. La parte "rellenar formularios de edición una vez más" me confunde. – timkay

+0

En realidad ese fue mi error, en su caso, realmente no hay diferencia entre esos métodos. Entonces usa lo que quieras –

+0

@timkay pero no olvide que 'render' y' redirect_to' son métodos completamente deferentes. Lea [Rails Guides on Rendering] (http://guides.rubyonrails.org/layouts_and_rendering.html) para obtener más información. –

43

De forma predeterminada, debe utilizar una instrucción separada, p.

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

This ticket tiene un parche que le permite utilizar render 'edit', :notice => 'message'. No entró en Rails, pero hay una gema, flash_render, que lo agrega.

+1

Si está usando 'render' (en lugar de' redirect_to'), generalmente quiere usar 'flash.now'. Explico por qué en detalle en [esta publicación del blog] (http://ryanlue.com/posts/2017-08-24-rails-render#implications-for-flash). –

9

Si solo usa flash[:notice] ese valor seguirá estando disponible en la próxima solicitud. Es decir, verá el texto en las siguientes 2 páginas. En su lugar, use flash.now para que solo el valor esté disponible en la solicitud actual.

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

Como referencia, lea Action Controller Overview 5.2.1

Cuestiones relacionadas