tutorial software rails ejemplos descargar curso caracteristicas aprender ruby-on-rails

ruby-on-rails - ejemplos - ruby on rails software



¿Por qué el mensaje flash no desaparecerá? (6)

Anteriormente tuve el mismo problema, pero ahora lo resolví a través de esto:
Prueba esto en tu código

<script type="text/javascript"> $(document).ready(function(){ setTimeout(function(){ $(''#flash'').fadeOut(); }, 2000); }) </script>

Estoy haciendo un manejo de excepciones en mi controlador, cuando hay una excepción lanzada: crear acción, voy a renderizar a la: nueva acción y mostrar un mensaje flash.

Todo funciona bien, puedo ver el mensaje flash cuando se detecta una excepción, pero cuando lo redirecciono (hago clic a mano) en otra página, el mensaje flash sigue aquí . Luego redirecciono a otra página ( el segundo clic a mano) , el mensaje podría desaparecer.

¿Alguien que sabe cuál es el motivo?

Mi código de controlador:

class MessagesController < ApplicationController rescue_from Exception, :with => :render_new def new end def create end private def render_new flash[:alert] = t("uploading_error") render :action => :new end end

Mi código de diseño (Haml):

%body #content - unless flash[:alert].blank? #alert= flash[:alert]


Decidir entre flash.now y flash regular es un dolor en el culo y bastante frágil en mi experiencia. Uso el flash regular y luego modifico mi parcial que muestra los flashes para eliminar el contenido de cada flash después de que el usuario lo haya visto. Creo que esto es mejor porque

a) no tienes que pensar en eso

b) "¿lo ha visto el usuario?" (es decir, "¿se han renderizado parcialmente los flashes?") es el mejor criterio para decidir si borrar o no el flash, en lugar de cualquier lógica en su aplicación.

Mi flash parcial se ve así: también uso un poco de jquery para resaltar los flashes (es decir, hacer que parpadeen en amarillo por un segundo):

<div id="flashes"> <% if flash[:notice] %> <p id="flash_notice" class="messages notice"><%= flash[:notice] %></p> <%= javascript_tag "$(''#flash_notice'').effect(''highlight'',{},1000);" %> <% end %> <% if flash[:error] || flash[:errors] %> <p id="flash_errors" class="messages errors"><%= flash[:error] || flash[:errors] %></p> <%= javascript_tag "$(''#flash_errors'').effect(''highlight'',{},1000);" %> <% end %> <% flash[:error] = flash[:errors] = flash[:notice] = nil %> </div>


Incluso esto no funciona ... ciertos tipos de excepciones como errores de sintaxis ... evitarán que se transfiera cualquier tipo de cookie, flash o parámetro del controlador a la vista. Su única opción es usar una clave de sesión y luego borrarla después de mostrar el error.

Pruebe su solución con un error de sintaxis ... debería ver que su mensaje no aparecerá en la página redirigida con nada más que con una clave de sesión .....


Reemplazar

flash[:alert] = t("uploading_error")

con

flash.now[:alert] = t("uploading_error")

y ver si ese es el resultado que esperas?

flash[:alert] se mantendrá en la página siguiente (por lo tanto, solo desaparece en la segunda redirección); pero flash.now[:alert] solo se mostrará para la página actual.


También sugiero borrar los hashes internos del flash al mostrarlos. flash.clear hará el truco de una manera limpia:

<% flash.each do |key, value| %> <div class="alert alert-<%= key %>"> <%= value %> </div> <% end %> <% flash.clear %> #this line clears the object

flash.clear


Una alternativa es usar flash.clear al final del parcial, así:

<% if !flash.empty? %> <div class="flash-messages-container"> <% flash.each do |name, msg| %> <% if msg.is_a?(String) && [:success, :info, :error, :warning].include?(name) %> <div class="flash-message" data-type="<%= name %>" > <%= msg %> </div> <% end %> <% end %> </div> <% flash.clear %> <% end %>