Pregunta ¿Por qué el mensaje flash no desaparecerá?


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 redirigir a (haga clic a mano) otra página, el mensaje flash aún aquí. Luego redirijo 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]

73
2018-01-06 10:31


origen


Respuestas:


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 siguiente página (por lo tanto, solo desaparece en la segunda redirección); pero flash.now[:alert] solo se mostrará para la página actual.


148
2018-01-06 10:39



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>

45
2018-01-06 11:45



Una alternativa es usar flash.clear al final del parcial como tal:

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

30
2018-06-19 01:58



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>

2
2018-02-19 12:48



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


1
2018-01-21 07:13



También sugiero limpiar el flash hash internos al mostrar. 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

http://api.rubyonrails.org/classes/ActionDispatch/Flash/FlashHash.html#method-i-clear


0
2018-01-21 19:28