关于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'
本文探讨了Rails框架中Flash数据的生命周期问题,特别是在before_filter中设置数据时的行为特性。实验表明,使用`flash`与`flash.now`的区别在于数据的生命周期长度。
2万+

被折叠的 条评论
为什么被折叠?



