`
qiezi
  • 浏览: 497725 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

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

class CacheController < ApplicationController
  caches_action 
:cache_one
  caches_page   
:cache_two
  
#
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

  
#
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,暂时还没找出修复方法。

分享到:
评论

相关推荐

    RoR-Capstone:Ruby on Rails模块的顶点

    Ruby on Rails Group我们的交易应用程序此应用程序可帮助学生根据自己的学科安排学习时间。 他们可以跟踪他们花费在学习特定主题上的时间。...设置打开控制台下载或git clone 光盘RoR-Capstone 运行bundle install

    ror-api:ROR火

    单个组织记录由以下JSON结构表示: { "id":"https://ror.org/013cjyk83", "name":"PSL Research University", "email_address":null, "ip_addresses":[ ], "established":2010, "types":[ "Education" ], ...

    ROR_lesson:乌迪米

    标题中的“ROR_lesson:乌迪米”很可能是指Ruby on Rails(RoR)的一堂课程,其中“乌迪米”可能是课程的特定主题或讲师的名字。Ruby on Rails是一种流行的开源Web应用程序框架,它基于Ruby编程语言,用于快速开发...

    RoR-Newsroom:熨斗的RoR项目

    **RoR-Newsroom: 熨斗的Ruby on Rails项目** RoR Newsroom是一个基于Ruby on Rails(RoR)的Content Management System (CMS),专为实现特定的发布工作流程而设计。RoR,全称Ruby on Rails,是Ruby编程语言的一个...

    sample-ror-app:Ruby on Rails 教程

    Ruby on Rails,简称RoR,是一个基于Ruby编程语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,强调“DRY”(Don't Repeat Yourself)原则和“Convention over Configuration”理念,使得开发...

    RoR-Sample:Ruby On Rail 示例

    Ruby on Rails,简称RoR,是一个基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,用于快速开发高效、可维护的Web应用。RoR的核心理念是DRY(Don't Repeat Yourself)和Convention ...

    RoR2SharedItems:BepInEx Modloader的降雨风险2共享物品mod

    多人RoR2游戏应该快节奏而有趣。 但是,通常情况下,玩家会遇到战利品被盗或一名玩家主导游戏的问题。 显然,解决此问题的最佳方法是首先消除ho积的动机! ShareSuite是一款具有多种系统的mod,旨在共享您在整个...

    RoR2Modifact:A Rain of Rain 2 mod专注于提供挂钩来改变各种工件

    RoR2Modifact 是一款针对游戏《雨中冒险2》(Rain of Rain 2)的模组,它的主要目标是为玩家提供自定义工件(Artifacts)的能力。工件在《雨中冒险2》中扮演着至关重要的角色,它们为玩家的角色提供了各种独特的效果和...

    RoR-Depot:Ruby on Rails 仓库项目

    Rails,全称 Ruby on Rails,是由 David Heinemeier Hansson 创建的开源 Web 应用程序框架,它遵循 Model-View-Controller(MVC)架构模式,强调“约定优于配置”和“DRY(Don't Repeat Yourself)”原则,以简化...

    ror-capstoneproject:一个完成Microverse的Ruby on Rails模块的单独项目

    自述文件 该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 数据库初始化 ...服务(作业队列,缓存服务器,搜索引擎等) 部署说明 ...

    ror_demo:Ruby在铁轨上

    您可能要讲的内容: Ruby版本系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列,缓存服务器,搜索引擎等) 部署说明… 如果您不打算运行rake doc:app请随意使用其他标记语言。

    RoR-Project:这是一个存储我的测试 RoR 项目的 repo

    自述 此自述文件通常会记录启动和运行应用程序所需的任何步骤。 您可能想要涵盖的内容: ...服务(作业队列、缓存服务器、搜索引擎等) 部署说明 … 如果您不打算运行rake doc:app请随意使用不同的标记语言。

    RoR-start:我正在学习Ruby on Rails!

    自述文件该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列,缓存服务器,搜索引擎等) 部署说明...

    ROR_Wedding:使用Ruby on Rails构建的婚礼网站

    您可能要讲的内容: Ruby版本系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列,缓存服务器,搜索引擎等) 部署说明… 如果您不打算运行rake doc:app请随意使用其他标记语言。

    ror-FotoGallery:基于Rails的照片管理应用程序中的ruby

    ==自述 该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: ...服务(作业队列,缓存服务器,搜索引擎等) 部署说明 ... 如果您不打算运行rake doc:app,请随意使用其他标记语言。

    dokushu-ror-library:实施自学的Ruby on Rails库系统

    自述文件 该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 数据库初始化 ...服务(作业队列,缓存服务器,搜索引擎等) 部署说明 ...

    ror-website:开源车辆模拟器Rigs of Rods的官方网站-html source website

    rigsofrods.org 的运行由此源代码运行。 您可以自由地提出建议和建议。...git clone https://github.com/Zentro/ror-website.git . npm install npm run build 编译和热重装以进行开发 npm run serve

    ror-test:这是我其余api的ruby on rails测试

    这是RestApi的Rails测试创建选项rails new my-api --api --no-sprockets -d mysql码头工人docker compose up -d开始(建议阅读) rails db:drop db:create db:migraterails sRuby版本:2.7.1 Rails版本:6.0.3.4更...

    RoR_TransactApp:事务管理器Ruby on Rails应用程序,用于支出管理

    更新版本1.1 即将推出的功能 UI重新设计 图像上传持久性 费用出口 TransactApp-Ruby on Rails Web应用程序 TransactApp允许用户创建一个帐户并登录以对提交的任何交易进行分组 目录 关于该项目 ...

    ror中文资料

    Ruby on Rails(RoR)是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式,旨在简化Web开发过程,提高开发效率。RoR强调“约定优于配置”,提供了一套完整的工具链,使得开发者...

Global site tag (gtag.js) - Google Analytics