2

早上好,

一些背景知识可能会有所帮助。我正在创建一个非常简单的应用程序,用作考勤跟踪解决方案——它将坐在健身房的一台正在运行的计算机上,人们可以输入他们的姓名并根据他们所做的锻炼类型单击按钮。

运行该应用程序的人并不过分技术性很强 - 但我想给他们一种方法来更改主页以及“帮助”页面上的基本文本。我创建了一个 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 方法之外时,这会引发错误,因为没有“元”变量。

4

1 回答 1

2

Rails provides you with afoo_changed? method that tells you if the foo attribute has changed and a changes method that lists all the changes. By the time your sweeper is called I suspect these will have already been reset.

You could however add a before_update callback that would check whether the columns you are interested in are dirty. Set an instance variable based on that and then check the value of the instance variable in your sweeper.

于 2012-04-07T16:14:40.310 回答