早上好,
一些背景知识可能会有所帮助。我正在创建一个非常简单的应用程序,用作考勤跟踪解决方案——它将坐在健身房的一台正在运行的计算机上,人们可以输入他们的姓名并根据他们所做的锻炼类型单击按钮。
运行该应用程序的人并不过分技术性很强 - 但我想给他们一种方法来更改主页以及“帮助”页面上的基本文本。我创建了一个 Meta 模型,其中包含“帮助文本”“主页文本”等列,它们可以通过 ActiveAdmin 界面进行更新。
我想在主页和帮助页面上进行页面缓存(更重要的是为我自己更复杂的项目学习 Rails 缓存)并且只想在 Meta ->“help_text”属性发生变化时使“帮助”页面过期,但如果任何其他 Meta -> 属性已更改,则使主页过期。
这可能吗?
在这一点上,我的缓存代码非常基本:
class MetaSweeper < ActionController::Caching::Sweeper
observe Meta
def after_create(meta)
expire_cache_for(meta)
puts "[CACHE] Expiring cached pages"
end
def after_update(meta)
expire_cache_for(meta)
puts "[CACHE] Expiring cached pages"
end
def after_destroy(meta)
expire_cache_for(meta)
puts "[CACHE] Expiring cached pages"
end
private
def expire_cache_for(meta)
expire_page(:controller => 'static_pages', :action => 'home')
expire_page(:controller => 'static_pages', :action => 'help')
# Expire a fragment
#expire_fragment('all_available_products')
end
end
在 application_controller 中:
cache_sweeper :meta_sweeper
谢谢!
编辑 1
从第一个答案开始,我尝试在“Meta”模型上设置一个虚拟属性,以尝试捕获 help_content 属性是否已更改,以便确定是否应该使 /help 页面过期。
元.rb
attr_accessor :help_changed
before_update :set_cache_expiry_checker
private
def set_cache_expiry_checker
help_changed = "you bet its changed!"
end
meta_sweeper.rb
def after_update(meta)
puts "should be doing something here about expiring...."
if meta.help_changed
puts "should expire help page"
else
puts "should NOT expire help page"
end
当我运行我的应用程序时,我看到了第一个 puts 的输出,但没有看到第二个。meta.help_changed 似乎为零....即使我在模型上有虚拟属性。如果我在 after_update 的顶部执行“放置 meta.inspect”,我会看到除虚拟属性之外的所有元属性。清扫器中是否发生了仅提取数据库内容的事情?
扫地机内部是否还有其他地方可以设置变量来执行此操作?我试过做一个:
expire_help_cache = meta.help_changed
在 meta_sweeper.rb 的最顶部,但是当您不在 after_update 方法之外时,这会引发错误,因为没有“元”变量。