在轨道,清扫没有得到所谓的模型只设置
-
13-09-2019 - |
题
我工作的一个轨道应用程序,在那里,我使用的页面缓存储html静态的输出。缓存。我有麻烦即将到期的缓存,虽然。
我相信我的问题是,部分因为我没有过期的缓自我控制器。所有的必要行动,为此正在处理的模型。这看来似乎应该是可行的,但所引用的基于模型的缓期,我发现似乎是出的日期,或是否不能工作。
在我的环境。rb文件,我打电话
config.load_paths += %W( #{RAILS_ROOT}/app/sweepers )
和我有,在扫文件夹,LinkSweeper文件:
class LinkSweeper < ActionController::Caching::Sweeper
observe Link
def after_update(link)
clear_links_cache(link)
end
def clear_links_cache(link)
# expire_page :controller => 'links', :action => 'show', :md5 => link.md5
expire_page '/l/'+ link.md5 + '.html'
end
end
所以... 为什么不删除的页面缓存,当我更新模型吗? (的过程:用脚本/控制台,我选择的项目的数据库,并为他们节省的,但它们对应的网页并不是删除从高速缓存),我还调用具体方法的链接模型,通常会援引该清扫车。既不是工作。
如果它的事项,缓存文件是一个md5hash关的一个关键价值链接表。高速缓存的网页,是获得保存的东西如/l/45ed4aade64d427...99919cba2bd90f.html.
从本质上讲,它似乎虽然清扫并不是实际观测的链接。我也读取(在这里,),它可能可以简单地添加扫地,配置。active_record.观察员在环境。rb,但这似乎并没有这样做(以及我不知道如果load_path的应用程序/清扫环境。rb省略)。
解决方案
只是一个注:你可以使用 cache_sweeper
在ApplicationController.
class ApplicationController < ActionController::Base
cache_sweeper :my_sweeper
end
class MySweeper < ActionController::Caching::Sweeper
observe MyModel
def after_update(my_model)
expire_page(...)
end
end
其他提示
所以我已经尝试一些不同的做法,看看是什么在起作用,什么不可行。
再次,总结情况: 我的目标是到期页面缓存的对象时更新,但是到期,它们没有依靠一个控制器的行动。 常规扫使用一线在控制通知扫地,它需要的功能。在这种情况下,我不能使用一线的控制,作为更新内发生的模型。正常的扫地的教程不工作,因为他们相信,你的主要相互作用与数据库的目的是通过控制器。
如果在读这个,你看到一种方法来加强我的代码,请评论和让我知道。
首先,让我们来看看事情做的工作,在种情况下你被困在这,也需要帮助。
所有的事情我试过了,唯一的事情,真的似乎工作是宣布一个after_update命令在观察员的模式。在该命令,我使用的明确命令expire_page行动,并包含一条道路,已被宣布在路线。rb。
此。这个工作:
在config/路线。rb:
map.link 'l/:md5.:format', :controller => 'links', :action => 'show'
在应用程序/型号/link_observer.rb:
def after_update(link)
ActionController::Base.expire_page(app.link_path(:md5 => link.md5))
end
请注意,"md5"是具体到我的应用程序。你可能要使用身份证或其它一些独特的识别符。
我还发现,宣布ActionController::基...线的方法模型,在做的更新工作。也就是说,在链接。rb,在该方法的实际更新数据库,如果我只是坚持整个线,它的工作。但因为我可能要到期,页面缓存在的其他方法,在未来,我还是拥有它提取到的观察员。
现在,让我们看看一些东西,没有工作,在种情况下你在谷歌上搜索围绕这一点。
叫"expire_page(...)" 内after_update(链接)内的方法link_observer.rb没有工作,因为它返回了一个"未定义的方法`expire_page'"的错误
创建一个扫文件 观察到的模式没有工作。我没找到任何错误代码,但它只是似乎甚至不知道它有工作要做。这是在明确地称之为"配置。load_paths+=%W(#{RAILS_ROOT}/app/扫)"内环境。rb。只是在情况下,我胖的手指东西在那个代码,那就是:
class LinkSweeper < ActionController::Caching::Sweeper
observe Link
def after_update(link)
clear_links_cache(link)
end
def clear_links_cache(link)
# DID NOT WORK expire_page :controller => 'links', :action => 'show', :md5 => link.md5
# DID NOT WORK expire_page '/l/'+ link.md5 + '.html'
# DID NOT WORK ActionController::Base.expire_page(app.link_path(:md5 => link.md5))
end
end
那上面的例子有link_sweeper.rb文件中的一个目录/app/清道夫.我也试过把link_sweeper.rb内的应用程序/模型目录,并尝试打电话给它的配置。active_record.观察员指令在环境。rb:
config.active_record.observers = :link_observer, :link_sweeper
但是,这并没有工作,无论是。
所以,是的。这很可能是这些方法中的一个会工作,我搞砸了东西的代码。但我想我所做的一切,通过这本书。
最终,以总结:而不是使用一个清扫过期页面缓存,你想要建立一个after_回调在模型中的观察员。你将要使用的明确路径的基础。expire_page方法:
def after_update(<model>) # where <model> is the name of the model you're observing
ActionController::Base.expire_page(app.<model>_path(:id => <model>.id)) # where <model> is the name of the model you're observing
end
我们希望这将帮助别人的道路。再次,如果你看到任何地方我不工作的代码在哪里我应该做一些不同的东西,请让我知道。如果你看到的东西在我工作的代码,可以更严格的,请让我知道这一点。
我遇到同一问题时想要做的碎片缓存(轨3).不能获得扫地的观察,所以我决定用于解决使它AR观察员如上所述,并呼 ApplicationController.new.expire_fragment(...)
.
我没得到这工作.只有轻微的差别在我的设置,清扫部分的一个轨道发动机;其占有轻微的差异(装载清扫文件需要在发动机的初始而不是增加它的负荷路环境。rb,等等)。
因此,清扫车装载在init。rb的发动机是这样的:
require File.join(File.dirname(__FILE__), 'app', 'sweepers', cached_category_count_sweeper')
我把它叫做一个扫地,因为它"扫荡"缓,但我想它只是一个观察员对该模型:
class CachedCategoryCountSweeper < ActiveRecord::Observer
observe CategoryFeature
def before_save(cf)
expire_cache(cf.category_id_was) if cf.category_id_changed?
end
def after_save(cf)
expire_cache(cf.category_id)
end
def after_destroy(cf)
expire_cache(cf.category_id)
end
def expire_cache(c)
ApplicationController.expire_page("/categories/#{c}/counts.xml") if !c.nil?
end
end
坦率地说,我不喜欢来硬代码的道路,但是我试图添加:
include ActionController:UrlWriter
然后使用的路径的方法,但它只能为我工作在发展。它没有工作,在生产,因为我的生产服务器使用的相对url根(而不是虚拟的主机)和内部法"page_cache_path"将始终如一地获得的文件的道路是错误的,所以它不能过期。
由于这是一个观察者,我加入到环境中。rb:
config.active_record.observers = :cached_category_count_sweeper
最后控制器,使用高速缓冲存储器(不会过期,这是通过模型观察员):
class CachedCategoryCountsController < ApplicationController
caches_page :index
# GET /cached_category_counts.xml
def index
...
end
end
无论如何,希望这有所帮助。
安德烈斯*蒙塔诺
我已经能够获得它的工作,通过加入
ActionController::Base.expire_page(app.link_path(:md5 => @link.md5))
该方法,在该模型本身就是更新数据库。 这感觉有点哈克,虽然我很想知道,如果任何人都可以解释为什么它不工作的正常清扫设置的,如果有一个更优雅的方式来处理这个问题。
这段代码(除了从定义我把我自己的应用程序)来自 这个职位上ruby-forum.com.
我写了一位关于这个题目: 轨道高速缓存清扫混乱.很想听听你的意见。
根据@moiristo和@ZoogieZork's答案,我猜这会的工作(未经测试).
class LinkSweeper < ActiveRecord::Observer
include ActionController::Caching::Pages
# or if you want to expire fragments
#include ActionController::Caching::Fragments
observe Link
def after_update(link)
expire_page( ... )
#expire_fragment( ... )
end
end