[RoR] ActionController::Caching模块缓存位置BUG

Caching模块用来实现caches_action/caches_page/fragment,普通用法没发现什么问题,问题在于使用下面的例子时,它不能缓存到正确的位置:

class CacheController  <  ApplicationController
  caches_action 
: cache_one
  caches_page   
: cache_two
  
# dot.gif
end

class TestController  <  ApplicationController
  def one
    render 
: inline  =>   <<- EOS
Test
:: one < br  />
<%=  render_component  : controller  =>   ' cache ' ,   : action  =>   ' cache_one '   %>
    EOS
  end

  def two
    render 
: inline  =>   <<- EOS
Test
:: two < br  />
<%=  render_component  : controller  =>   ' cache ' ,   : action  =>   ' cache_two '   %>
    EOS
  end

  
# dot.gif
end

cache_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
  end
end

通过替换controller和action来解决,测试结果正确。

不过还有其它问题没修复,比如url中参数的问题,虽然调用render_component时我并没有传递参数,但它还是把参数给传递了。另外没有修复caches_page和fragment。

其实这个问题是由render_component带来的,所以最好的修复办法当然是修复这个方法,让它处理正确的controller/action/params,暂时还没找出修复方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值