81 votes

Pourquoi flash message de ne pas disparaître?

Je fais quelques la gestion des exceptions dans mon contrôleur, quand il y a une exception :créer de l'action, je rendrai à l' :nouvelle action et afficher un message flash.

Tout fonctionne bien, je peux voir le message flash lorsque exception interceptée, mais quand j'ai rediriger vers(pratique cliquez sur) une autre page, le message flash encore ici. Puis-je rediriger vers une autre page(la deuxième pratique de la souris), le message pourrait disparaître.

Quelqu'un qui sait quelle est la raison?

Mon contrôleur de code:

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

Ma mise en page de code (Haml):

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

170voto

Zabba Points 26372

Remplacer

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

avec

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

et voir si c'est le résultat que vous attendez?

flash[:alert] va rester autour de la prochaine page (donc il ne disparaît lors de la deuxième redirection); mais flash.now[:alert] uniquement de l'affichage de la page en cours.

Voir également Savoir Quand Utiliser le flash.maintenant

46voto

Max Williams Points 10129

Décider entre flash.maintenant et régulière flash est une douleur dans le cul et assez fragile dans mon expérience. J'utilise régulièrement flash, puis modifier mes partiels qui affiche le symbole clignote pour supprimer le contenu de chaque flash après que l'utilisateur l'a vu. Je pense que c'est mieux parce que

a) vous n'avez pas à y penser

b) "a l'utilisateur vu?" (c'est à dire "a l'clignote partielle été rendu?") c'est le meilleur critère pour décider si ou de ne pas effacer le flash, plutôt que toute la logique de votre application.

Mon flash partielle ressemble à ça - je également utiliser un peu de jquery, de souligner l'clignote (c'est à dire les rendre flash jaune pour une seconde):

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

34voto

CoderDave Points 193

Une alternative est d'utiliser le flash.clair à la fin de l'partielle de la sorte:

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

1voto

surtep Points 11

Même si cela ne fonctionne pas......certains types d'exceptions comme les erreurs de syntaxe...permettra d'éviter tout type de cookies, flash ou des paramètres de transfert de contrôleur de vue. Votre seule option est d'utiliser une clé de session puis l'effacer après avoir montré l'erreur.

Essayer votre solution avec une erreur de syntaxe...vous devriez voir que votre message n'apparaîtra pas dans la redirection de la page avec tout, sauf avec une clé de session.....

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X