Чому флеш-повідомлення не зникає?


79

Я роблю деяку обробку винятків у своєму контролері, коли виникає виняток: 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]

Відповіді:


163

Замінити

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

з

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

і подивіться, чи це результат, якого ви очікуєте?

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


Відмінне рішення та посилання! Дякую забба!
Jimmy Huang

1
Тепер я знаю більше про спалах та flash.now. Отже, якщо я замість рендерингу користувач redirect_to, використання flash теж не буде проблемою.
Jimmy Huang

1
FYI: посилання розірвано. Але, не бачачи посилання, я повинен визнати, що мені цікаво, чому flash.now [: alert] не є типовим.
Поїздка

Ваш веб-сайт наразі не може отримати доступ: P
Rafaiel

1
Rails doc також містить пристойну інформацію про flash та flash.now
Забба

45

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

а) не потрібно думати про це

б) "чи бачив це користувач?" (тобто "чи частково передані спалахи?") є найкращим критерієм для вирішення питання про чищення спалаху чи ні, а не будь-якою логікою у вашому додатку.

Мій частковий спалах виглядає так - я також використовую трохи 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>

Можливо, тупе запитання, але чи можливо, що при цьому видаляється черговий спалах, який збирається відтворити?
Бредфорд

@ Бредфорд - я не думаю: я просто очищаю три флеш-клавіші, які я надав. Вони жодним чином не можуть бути очищені без надання, і між ними не може бути зроблено та очищено нічого, оскільки очищення відбувається в тій же частці.
Макс Вільямс

Пізно до гри, але мені це подобається.
Dan Barron

1
Я просто спробував це. Я думаю, що flash.discard (a_single_key) кращий, оскільки встановлення значення nil не видаляє ключ із flash. Як результат, він може відображати порожнє повідомлення про видалений ключ.
TrongBang

34

Альтернативою є використання 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 %>

flash.clear набагато чистіше, ніж <% flash [: помилка] = flash [: помилки] = flash [: повідомлення] = nil%>
Кевін Зич

З мого досвіду, це найкращий спосіб це зробити, якщо вам не потрібні ваші флеш-повідомлення, щоб зберегтись. Не знаю, чому шаблони (можливо, ліси?) Не постачаються із flash.clear за замовчуванням.
Равенстін

2
flash.clear у мене не працює. Спалах все ще не зникає
Німіш


1

Навіть це не працює ...... певні типи винятків, такі як синтаксичні помилки ... заважатимуть передавати будь-який тип файлів cookie, флеш-пам'яті або параметрів із контролера у подання. Вашим єдиним варіантом є використання сеансового ключа, а потім його очищення після показу помилки.

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


1

Раніше у мене була та ж проблема, але тепер вирішена через це:
Спробуйте це у своєму коді

<script type="text/javascript">
  $(document).ready(function(){
    setTimeout(function(){
    $('#flash').fadeOut();
    }, 2000);
  })
</script>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.