关于flash中数据的生命周期,标准的说法是“写入flash中的数据将在下一个request处理完毕时清除”,但是如果在before_filter中将数据写入flash,则该数据的生命周期将跨越三个request,如下面的controller:
测试页面 test_flash_dest.rhtml如下:
我们用浏览器访问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,因为将上面代码中的
改为
则'xyz'数据能够如我们希望的那样仅跨越两个request
ruby 代码
- before_filter :redirect_filter, :only => :test_flash
- def redirect_filter
- flash[:written_by_filter]='xyz'
- redirect_to :action=>:test_flash_dest and return false
- end
- def test_flash
- end
- def test_flash_dest
- end
ruby 代码
- <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 代码
- flash[:written_by_filter] = 'xyz'
ruby 代码
- flash.now[:written_by_filter] = 'xyz'