ruby-on-rails - 在Rails中,仅模型设置不会调用Sweeper

标签 ruby-on-rails model observer-pattern sweeper

我正在使用Rails应用程序,在这里我使用页面缓存来存储静态html输出。缓存工作正常。不过,我在使缓存过期时遇到麻烦。

我认为我的问题部分是因为我没有从 Controller 中使缓存过期。在模型中处理了为此所需的所有 Action 。这似乎应该可行,但是我发现所有对基于模型的缓存过期的引用似乎都已过时,否则将无法正常工作。

在我的environment.rb文件中,我正在调用

config.load_paths += %W( #{RAILS_ROOT}/app/sweepers )

我在/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

那么...为什么更新模型时它不删除缓存的页面? (过程:使用脚本/控制台,我正在从数据库中选择项目并保存它们,但是它们的相应页面并未从缓存中删除),而且我还在Link模型中调用通常会调用的特定方法清扫车。都行不通。

如果很重要,则缓存的文件是链接表中键值的md5哈希值。缓存的页面将存储为/l/45ed4aade64d427...99919cba2bd90f.html之类的内容。

本质上,似乎Sweeper实际上并未观察到Link。我还阅读了(here),可能可以将清除程序简单地添加到environment.rb中的config.active_record.observers,但这似乎没有做到(而且我不确定应用程序/清除程序的load_path在environment.rb中消除了这一点)。

最佳答案

请注意:您可以在ApplicationController中使用cache_sweeper

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

关于ruby-on-rails - 在Rails中,仅模型设置不会调用Sweeper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1463714/

相关文章:

node.js - 在 sails.js 中过滤用户帖子数据

c# - 观察者能否使用 Rx 安全地监听多个可观察对象?

ruby-on-rails - Rails关系一对多;无法构建子对象?

mysql - 如何清除 session

ruby-on-rails - ActiveRecord 联接获取子对象而不是父对象

javascript - Angular 模型仅在 console.log() 之后更新

ruby-on-rails - 停止 postgres 进程重新启动 - mac

java - 如何解决这个警告?

android - 我可以从不扩展 Activity 的类(class)发送广播吗?

java工厂和观察者模式