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

олняю некоторую обработку исключений в моем контроллере, когда возникает исключение: create action, я буду отображать в: new 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]

Ответы на вопрос(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

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

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

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

Моя часть вспышки выглядит следующим образом - я также использую немного 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>
 Jimmy Huang06 янв. 2011 г., 13:19
Так что вы каждый раз очищаете флэш-сообщения, круто!
 Chris Nicola21 окт. 2011 г., 05:05
Определенно заслуживает и upvote.
 Bradford08 нояб. 2012 г., 22:47
Может быть, глупый вопрос, но возможно ли, что при этом удаляется еще одна флеш-карта, которая должна быть визуализирована?
 TrongBang29 окт. 2017 г., 04:11
Я только что попробовал это. Я думаю, что flash.discard (a_single_key) лучше, потому что установка значения в nil не удаляет ключ из flash. В результате может отображаться пустое сообщение для удаленного ключа.
 Max Williams17 сент. 2013 г., 16:04
@ Брэдфорд - я так не думаю: я просто очищаю три флэш-клавиши, которые я рендерил. Нет никакого способа, которым они очищаются без визуализации, и между ними не может произойти ничего, что очищается, поскольку очистка происходит в одной и той же части.
Решение Вопроса

замещать

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

с участием

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

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

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

 Trip14 мар. 2012 г., 16:17
К вашему сведению: ссылка не работает. Но не видя ссылки, я должен признать, что мне любопытно, почему flash.now [: alert] не используется по умолчанию.
 Jimmy Huang06 янв. 2011 г., 11:58
Отличное решение и ссылка! Спасибо, забба!
 indb19 февр. 2016 г., 13:29
не работает Flash.now [: alert] для меня
 Jimmy Huang06 янв. 2011 г., 13:20
Теперь я знаю больше о flash и flash.now. Так что если я использую redirect_to вместо render, использование flash также не составит проблемы.
 Zabba02 июл. 2012 г., 21:15
Rails Doc также имеет некоторые приличныеинформация на flash и flash.now

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

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

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

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

Альтернативой является использование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 %>
 Ravenstine26 янв. 2015 г., 22:20
По моему опыту, это лучший способ сделать это, если вам не нужны ваши флэш-сообщения для сохранения. Я не знаю, почему шаблоны (может, скаффолды делают?) Не поставляются с flash.clear по умолчанию.
 Kevin Zych15 нояб. 2014 г., 05:20
flash.clear намного чище, чем <% flash [: ошибка] = вспышка [: ошибки] = вспышка [: уведомление] = ноль%>
 indb19 февр. 2016 г., 13:30
flash.clear не работает для меня. Вспышка все еще не исчезает

Ваш ответ на вопрос