2011-11-24 22 views
26

¿Cuál es la mejor forma de enviar mensajes de error al redireccionar?Transmisión de mensajes de error a través de flash

He usado anteriormente dos enfoques, pero ambos tienen problemas.

(1) Al pasar todo el objeto con el error en flash y usando error_messages_for:

def destroy 
    if @item.destroy 
     flash[:error_item] = @item 
    end 
    redirect_to some_other_controller_path 
    end 

he encontrado que este método provoca desbordamientos de galletas.

(2) El paso de un solo mensaje de error:

def destroy 
    if @item.destroy 
     flash[:error] = @item.full_messages[0] 
    end 
    redirect_to some_other_controller_path 
    end 

De esta manera sólo enviar un solo mensaje de error, lo que si hay muchos? ¿Alguien sabe una mejor manera?

Respuesta

61

En primer lugar, puede lograr lo que está tratando de hacer estableciendo una sola oración.

flash[:error] = @item.errors.full_messages.to_sentence 

Creo que también podría establecerlo como la matriz sin desbordar la cookie.

flash[:error] = @item.errors.full_messages 

Pero, como dicen los demás, en general, es mejor usar flash para devolver mensajes específicos.

por ejemplo.

flash[:error] = "We were unable to destroy the Item" 

Un patrón común es como tal.

def some_action 
    if @record.action 
    flash[:notice] = "Action performed successfully" 
    redirect_to @record  
    else 
    flash[:error] = "Action failed" 
    render :action => "some_action" 
    end 
end 

A saber, tenemos dos caminos.

  1. Acción tiene éxito. Redireccionamos
  2. La acción falla. Mostramos una página, muestra un error y tenemos a mano el @record.errors para llamar al error_messages_for(@record) si lo deseamos.
+0

definitivamente ayuda! ¡Gracias! – alexs333

+2

Para la sección 'else' de su ejemplo, debe usar 'flash.now [: error] =" Acción fallida '' Ver: [the-flash] (http://guides.rubyonrails.org/action_controller_overview .html # the-flash) – Joris

0

desde Flash [Error] es un hash, se puede pasar mensajes de error a ella con una "< <" operador

2

Flash es una parte de la sesión de rieles que se despeja entre las solicitudes y se implementa sesión de rieles usando cookies (al menos hasta Rails-2). Cookies generalmente se usan para almacenar una cantidad mínima de datos ya que la cantidad máxima que la cookie predeterminada puede almacenar es de 4 kbs, creo. Entonces, almacenar todos los objetos del modelo podría no ser una buena opción. Para hacer eso, puede usar una tienda de cookies diferente que le permita almacenar una gran cantidad de datos.

En cuanto al segundo problema, puede almacenar tantos mensajes de error en la variable flash. Tal como lo hizo con flash[:error], puede hacer lo mismo y almacenar otros mensajes también utilizando otras teclas para almacenar otros mensajes.

Espero que esto ayude.

2

Esto es lo que funcionó para mí:

@item.errors.messages.map { |k,v| v }.join('<br>').html_safe 
+0

Esto debería marcarse como la respuesta en mi opinión. –

+0

Usar 'html_safe' aquí puede no ser seguro (abrir para XSS) según cómo se generen sus mensajes de error. Usar con extrema precaución ... – PinnyM

Cuestiones relacionadas