我使用javascript在我的rails应用程序中显示Flash消息(基本上每个Flash消息都是覆盖div)。刷新刷新
以下部分包含在我的主布局文件中,它负责显示闪存。我注意到,如果我刷新页面,同一个Flash消息不断重现。无论如何摆脱这一点?我知道我可以调用flash.discard,但不知道最好的地方是做什么,我不希望另一个控制器调用放弃闪光灯。
<% if !flash.nil? %>
<% if flash[:notice] %>
<script type="text/javascript">
//<![CDATA[
showFlash("<%= flash[:notice] %>", "flash-notice");
//]]>
</script>
<% end %>
<% if flash[:success] %>
<script type="text/javascript">
//<![CDATA[
showFlash("<%= flash[:success] %>", "flash-success");
//]]>
</script>
<% end %>
<% if flash[:error] %>
<script type="text/javascript">
//<![CDATA[
showFlash("<%= flash[:error] %>", "flash-error");
//]]>
</script>
<% end %>
<% end %>
function showFlash(msg, tp) {
if ($('#flash_messages_container').length > 0) {
flashAnimatedHide();
}
var flashContainer = $("<div id='flash_messages_container' class='flash-messages " + tp + " '></div>");
flashContainer.prepend("<div id='flash_messages_content'>" + msg + "<span class='go-right sprite close' id='close_flash'></span></div>");
$('body').prepend(flashContainer);
flashContainer.animate({
opacity : .1
}, '500', function(){
flashContainer.css('opacity', 1)
})
$('body').css('margin-top', flashContainer.outerHeight());
$('#close_flash').click(function() {
flashAnimatedHide();
$('body').css('margin-top', '0');
});
}
UPDATE
我怀疑这种情况正在发生,因为我开始使用的ETag为cient侧和反向代理缓存。所以我猜刷新只是加载缓存页面,其中包含Flash容器中的Flash消息。那么当启用缓存时人们如何放弃闪存?
我正在做一个flash.now [:notice] =“注销”redirect_to_back_or_default root_path。奇怪的是,我甚至没有看到最初的闪光消息。我认为我的问题与缓存有关,重复闪存的第二次刷新直接从浏览器缓存中提供(这是一个304未修改的响应),浏览器缓存版本的页面包含原始的Flash消息。不知道如何清除它。 – badnaam 2010-10-20 04:10:43
'flash.now'用于'render',而'flash'用于'重定向'。如果你在'redirect'上使用'flash.now'(就你的情况而言),这些Flash信息将会丢失。如果在'render'中使用'flash',则刷新后或者转到其他页面时将复制闪烁消息。这可能是Flash的工作原理而不是缓存。 – PeterWong 2010-10-20 06:13:00
顺便说一句,向下选民你能介意解释为什么投票吗? – PeterWong 2010-10-20 06:13:58