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
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 %>