代码之家  ›  专栏  ›  技术社区  ›  ryeguy

当我不想的时候,Rails正在缓存。为什么?

  •  1
  • ryeguy  · 技术社区  · 14 年前

    Rails正在缓存我的一个控制器的索引方法。它是一个非常简单的应用程序,只有两个控制器和几个操作。奇怪的是,我的应用程序中根本没有缓存,至少没有明确的缓存。如果我重新启动乘客,页面就会被打开。Rails是否执行某种自动页面缓存?

    • public 目录中没有文件
    • 页面正在返回一个 200 header
    • 我的视图中没有缓存块(如果重要的话,我使用haml)
    • 我没有定义操作、控制器或页面缓存
    • 请求 是命中rails,由生产日志验证

    我的作品中有以下内容。

    config.cache_classes=true
    config.action_controller.consider_all_requests_local=false config.action_controller.perform_caching=true config.action_view.cache_template_loading=true

    问题是,在我的视图中,它没有显示任何 releases 表中,但如果我重新启动乘客,它将显示。我知道这失败的原因是因为我可以启动Rails控制台并执行 release.ready which is the named scope being displayed in the view,and I actually get some results back.


    相关代码如下:

    型号/release.rb

    类发布<ActiveRecord::Base
    默认_scope:order=>'创建于描述'
    命名的_scope:ready,:conditions=>['show_on<=?并且被删除=?',时间。现在,错误]
    结束
    < /代码> 
    
    

    控制器/释放_controller.rb

    class releasescontroller<applicationcontroller
    DEF指数
    @releases=发布就绪
    结束
    结束
    < /代码> 
    
    

    views/releases/index.html.haml

    %table:border=>1
    %TR
    第%日
    第%标题
    第%艺术家
    第十歌
    -@释放。每次释放|
    -@release=释放
    
    %TR [释放]
    %TD
    =link_to_remote“删除”,:url=>释放,:method=>:删除,:confirm=>'删除?'
    =release.created_at.to_date.to_s(:long_ordinal)
    %td=链接到release.title,release.url
    %td=在“位置”编辑器字段:发布,:艺术家
    %td=在“位置”编辑器字段:发布,:歌曲
    < /代码> <至少不明确。如果我重新启动乘客,页面就会被打开。Rails是否执行某种自动页面缓存?

    • 中没有文件public目录
    • 页面正在返回200页眉
    • 我的视图中没有缓存块(如果重要的话,我使用haml)
    • 我没有定义操作、控制器或页面缓存
    • 请求撞轨,生产日志验证

    我的production.rb中有以下内容:

    config.cache_classes=真
    config.action_controller.consider_all_requests_local=false config.action_controller.perform_caching=true config.action_view.cache_template_loading=true

    问题是它没有显示任何Releasestable在我看来,如果我重新启动乘客的话。我知道这失败的原因是因为我可以启动Rails控制台Release.ready,这是视图中显示的命名范围,实际上我得到了一些结果。


    相关代码如下:

    型号/版本.rb

    class Release < ActiveRecord::Base
      default_scope :order => 'created_at DESC'
      named_scope :ready, :conditions => ['show_on <= ? AND is_deleted = ?', Time.now, false]
    end
    

    控制器/释放控制器.rb

    class ReleasesController < ApplicationController
      def index
        @releases = Release.ready
      end
    end
    

    视图/发布/index.html.haml

    %table{:border => 1}
      %tr
        %th Date
        %th Title
        %th Artist
        %th Song
      - @releases.each do |release|
        - @release = release
    
        %tr[release]
          %td
            = link_to_remote "delete", :url => release, :method => :delete , :confirm => 'Remove?'
            = release.created_at.to_date.to_s(:long_ordinal)
          %td= link_to release.title, release.url
          %td= in_place_editor_field :release, :artist
          %td= in_place_editor_field :release, :song
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   theIV    14 年前

    如果公用文件夹中没有文件,我认为您的视图不会被缓存。

    有一段时间,Rails已经缓存了视图源(就像模型一样),所以如果您对这些视图进行了更改,那么在生产环境中,您必须重新启动passenger,以便这些更改在您通过浏览器查看时生效。

    如果我的答案中有任何不清楚的地方,请告诉我。

    编辑:这里有一个到changelog的链接,当我相信它发生时: Ruby on Rails 2.3 Release Notes