Почему флеш сообщение не исчезнет?
Я выполняю некоторую обработку исключений в моем контроллере, когда возникает исключение: создать действие, я выполню рендеринг в действие: новое и покажу флэш-сообщение.
Все работает нормально, я вижу флэш-сообщение, когда возникает исключение, но когда я перенаправляю (вручную нажимаю) другую страницу, флэш-сообщение все еще здесь. Затем я перенаправляю на другую страницу (второй щелчок), сообщение может исчезнуть.
Кто-нибудь, кто знает, в чем причина?
Код моего контроллера:
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[:alert] = t("uploading_error")
с
flash.now.alert = t("uploading_error")
и посмотреть, если это результат, который вы ожидаете?
flash[:alert]
останется на следующей странице (следовательно, исчезнет только при втором перенаправлении); но flash.now.alert
будет отображаться только для текущей страницы.
Выбор между flash.now и обычным flash - это боль в заднице и довольно хрупкий в моем опыте. Я использую обычную вспышку, а затем изменяю свою частичку, которая отображает вспышки, чтобы удалить содержимое каждой вспышки после того, как пользователь ее увидел. Я думаю, что это лучше, потому что
а) тебе не нужно об этом думать
б) "пользователь видел это?" (т. е. "частично ли были сняты вспышки?") - это лучший критерий для решения, очищать ли вспышку или нет, а не какую-либо логику в вашем приложении.
Моя часть вспышки выглядит следующим образом - я также использую немного 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>
Альтернативой является использование 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 %>
Раньше у меня была такая же проблема, но теперь решаем через это:
Попробуйте это в своем коде
<script type="text/javascript">
$(document).ready(function(){
setTimeout(function(){
$('#flash').fadeOut();
}, 2000);
})
</script>
Я также предлагаю очистить 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
Даже это не работает...... определенные типы исключений, такие как синтаксические ошибки... будут препятствовать передаче файлов cookie, флэш-памяти или параметров из контроллера для просмотра. Единственный вариант - использовать ключ сеанса, а затем очистить его после отображения ошибки.
Попробуйте ваше решение с синтаксической ошибкой... вы должны увидеть, что ваше сообщение не будет отображаться на перенаправленной странице ни с чем, кроме как с ключом сеанса.....