我使用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');
});
}
更新
我怀疑这种情况正在发生,因为我开始使用etags进行客户端和反向代理缓存。所以我想刷新只是加载缓存页面,其中包含flash容器中的flash消息。那么,当启用缓存时,人们如何丢弃闪存?
答案 0 :(得分:3)
我之前遇到过重复的闪烁消息,似乎结果是同时但不确定是否相同的情况。
您在行动flash[:notice] = "something
时使用render :action => "somepage"
吗?
即。
def some_action
flash[:notice] = "some notice"
render :action => "other_action"
end
然后你会发现刷新后重复flash[:notice]
。
解决方案是改为使用flash.now
:
def some_action
flash.now[:notice] = "some notice"
render :action => "other_action"
end
并且没有其他任何东西需要改变。
请告诉我这是否无法解决您的问题。
答案 1 :(得分:0)
这是我使用的解决方案,请告诉我是否有更好的解决方案。这取决于启用cookie,值得担心的是什么?
<% if !flash.nil? %>
<% if flash[:notice] %>
<% cookies[:flash_notice] = flash[:notice] %>
<% end %>
<% if flash[:success] %>
<% cookies[:flash_success] = flash[:success] %>
<% end %>
<% if flash[:error] %>
<% cookies[:flash_error] = flash[:error] %>
<% end %>
<% end %>
然后使用javascript显示Flash消息并删除cookie
function doFlash() {
if ($.cookie("flash_success") != null) {
showFlash(removeSpace($.cookie("flash_success")), "flash-success");
$.cookie("flash_success", null);
}
if ($.cookie("flash_notice") != null) {
showFlash(removeSpace($.cookie("flash_notice")), "flash-notice");
$.cookie("flash_notice", null);
}
if ($.cookie("flash_error") != null) {
showFlash(removeSpace($.cookie("flash_error")), "flash-error");
$.cookie("flash_error", null);
}
}
答案 2 :(得分:0)
解决方案(rails 3.0.5):
设置控制器的动作如下:
class MessagesController < ApplicationController
respond_to :html, :js, :xml, :json
def create
@message = Message.create(params[:message])
flash.now[:notice] = 'This is my message'
respond_with(@message) do |format|
format.html { redirect_to '/', :flash => flash }
end
end
end
正如您所看到的,我在重定向时传递了一个:flash变量。