2007-06-21

rails, 跨越三个Request的flash数据

关键字: ruby rails
关于flash中数据的生命周期,标准的说法是“写入flash中的数据将在下一个request处理完毕时清除”,但是如果在before_filter中将数据写入flash,则该数据的生命周期将跨越三个request,如下面的controller:
ruby 代码
 
  1. before_filter :redirect_filter:only => :test_flash  
  2. def redirect_filter 
  3.     flash[:written_by_filter]='xyz'
  4.     redirect_to :action=>:test_flash_dest and return false  
  5. end  
  6.   
  7. def test_flash  
  8. end  
  9.   
  10. def test_flash_dest  
  11. end  
测试页面 test_flash_dest.rhtml如下:
ruby 代码
 
  1. <div>flash[:written_by_filter]=<%= flash[:written_by_filter] %></div>  

我们用浏览器访问test_flash action,会被重定向到test_flash_dest并显示"flash[:written_by_filter]=xyz",这时我们刷新一下,页面上仍旧显示“flash[:written_by_filter]=xyz”,再次刷新时才显示“flash[:written_by_filter]=”。

我不知道这是不是rails的bug,只是第一次发现这种行为时还是吃惊了一把。猜想rails是把调用before_filter的request及redirect_to的request视作同一个request,因为将上面代码中的
ruby 代码
 
  1. flash[:written_by_filter] = 'xyz'  
改为
ruby 代码
 
  1. flash.now[:written_by_filter] = 'xyz'  
则'xyz'数据能够如我们希望的那样仅跨越两个request
评论
发表评论

您还没有登录,请登录后发表评论

半人马
搜索本博客
最近访客
博客分类
最近加入圈子
存档
最新评论
评论排行榜