Почему флэш-сообщение не исчезнет?

Я занимаюсь обработкой исключений в своем контроллере, когда возникает исключение: create action, я буду отображать новое действие и показывать флеш-сообщение.

Все работает отлично, я вижу флэш-сообщение, когда исключение поймано, но когда я перенаправляю (щелкаю по ссылке) другую страницу, флэш-сообщение все еще здесь. Затем я перенаправляюсь на другую страницу ( второй щелчок), сообщение может исчезнуть.

Кто знает, в чем причина?

Мой код контроллера:

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

Мой код макета (Haml):

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

Ответ 1

замещать

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

с

flash.now.alert = t("uploading_error")

и посмотрите, является ли это результатом, которого вы ожидаете?

flash[:alert] будет оставаться на следующей странице (отсюда она исчезает только во второй переадресации); но flash.now.alert будет отображаться только для текущей страницы.

Ответ 2

Выбор между flash.now и регулярной вспышкой - это боль в заднице и довольно хрупкая по моему опыту. Я использую регулярную вспышку, а затем модифицирую свою часть, которая отображает вспышки, чтобы удалить содержимое каждой вспышки после того, как пользователь ее увидел. Я думаю, что это лучше, потому что

a) вам не нужно об этом думать

b) "пользователь видел это?" (т.е. "частичная обработка вспышек?" ) является лучшим критерием для принятия решения о том, следует ли очищать флеш, а не какую-либо логику в вашем приложении.

Моя частичная часть вспышки выглядит так: я также использую немного jquery, чтобы выделить вспышки (т.е. сделать их желтыми на секунду):

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

Ответ 3

Альтернативой является использование flash.clear в конце частичного так:

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

Ответ 4

Раньше у меня была такая же проблема, но теперь решена через это:
Попробуйте это в своем коде

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

Ответ 5

Даже это не сработает... некоторые типы исключений, такие как синтаксические ошибки... предотвратят передачу любого типа файлов cookie, flash или параметров из контроллера для просмотра. Ваш единственный вариант - использовать ключ сеанса, а затем очистить его после появления ошибки.

Попробуйте свое решение с синтаксической ошибкой... вы должны увидеть, что ваше сообщение не будет отображаться на перенаправленной странице ничем другим, кроме как с помощью сеансового ключа.....

Ответ 6

Я также предлагаю очистить внутренние хэши flash при отображении. flash.clear сделает трюк чистым способом:

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