本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7584362
建立时间:2006年5月29日




[Ruby on Rails]ActionController::Caching模块缓存位置BUG
软件技术

lhwork 发表于 2007/2/8 10:09:47

Caching模块用来实现caches_action/caches_page/fragment,普通用法没发现什么问题,问题在于使用下面的例子时,它不能缓存到正确的位置: class CacheController < ApplicationController  caches_action :cache_one  caches_page   :cache_two  #500)this.width=500'>end class TestController < ApplicationController  def one    render :inline => <<->EOSTest::one<br /><%= render_component :controller => 'cache', :action => 'cache_one' %>    EOS  end  def two    render :inline => <<->EOSTest::two<br /><%= render_component :controller => 'cache', :action => 'cache_two' %>    EOS  end  #500)this.width=500'>endcache_one和cache_two的实现就省略了。访问直接访问这2个action,能够在正确的目录下生成缓存文件。不过访问test/one和test/two就会出现缓存错误,2个缓存文件被生成到CACHE_ROOT/test下,试想如果在多个地方使用render_component,就会产生很多份一样内容的缓存。request会被传递给controller,当访问/test/one时,这个request保留有这个url。调用render_component时,会生成一个新的controller,这个request也被传递,不过url却还是/test/one,所以就有这个问题。修复: module ActionController #:nodoc:  module Caching    module Actions      class ActionCacheFilter #:nodoc:        def before(controller)          return unless @actions.include?(controller.action_name.intern)          url = controller.url_for(:controller => controller.controller_name, :action => controller.action_name)          if cache = controller.read_fragment(url.split("://").last)            controller.rendered_action_cache = true            controller.send(:render_text, cache)            false          end        end        def after(controller)          return if !@actions.include?(controller.action_name.intern) || controller.rendered_action_cache          url = controller.url_for(:controller => controller.controller_name, :action => controller.action_name)          controller.write_fragment(url.split("://").last, controller.response.body)        end      end    end  endend通过替换controller和action来解决,测试结果正确。不过还有其它问题没修复,比如url中参数的问题,虽然调用render_component时我并没有传递参数,但它还是把参数给传递了。另外没有修复caches_page和fragment。其实这个问题是由render_component带来的,所以最好的修复办法当然是修复这个方法,让它处理正确的controller/action/params,暂时还没找出修复方法。


阅读全文(2173) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.529 second(s), page refreshed 144762338 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号