【问题标题】:expire_action from model来自模型的 expire_action
【发布时间】:2012-03-18 03:39:53
【问题描述】:

我有一个离线 rake 作业来更新我的模型。发生这种情况时,我想使该模型的 :show 操作过期。

# in lib/models/my_model.rb
after_update :expire_cache
def expire_cache
  expire_action :controller => :my_models, :action => :show, :id => self
end

这不起作用,因为 expire_action 在模型中不可用。调用 ActionController.new.expire_action 给了我很多奇怪的路由问题,这是合理的,因为没有连接任何路由逻辑。

我认为 expire_action 的常用方法是使用清扫器,但这不起作用,因为我的模型不是通过控制器操作更新的。

注意:我觉得我可能以错误的方式使用缓存,因为我无法在任何地方找到答案。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 caching


    【解决方案1】:

    您正在寻找ActionController Sweeper。您可以找到有关如何实现它们的官方 Rails 文档here,但您可能想要这样的东西:

    class MyModelSweeper < ActionController::Caching::Sweeper
      observe MyModel
    
      def after_update(my_model)
        expire_action :controller => :my_models, :action => :show, :id => my_model
      end
    
    end
    

    【讨论】:

    • 我的理解是 Sweepers 挂钩到控制器动作中,这不起作用,因为模型没有作为动作的一部分进行更新。这不是真的吗?
    • Sweepers 观察模型,但也与控制器挂钩(例如,允许您使页面过期)。通过执行observe MyModel,sweeper 将监视模型上的更改,然后可以根据这些更改使页面过期,所有这些都在响应堆栈之外。
    • 所以如果 rails 服务器正在运行,它会检测到由单独的离线 rake 任务完成的模型变化吗?
    • 不,rake 任务将自己执行更改。因此,您需要在运行 Rails 的服务器上运行任务,以便它可以正确访问相同的缓存。
    猜你喜欢
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2021-11-12
    • 2019-11-06
    • 2020-08-15
    • 1970-01-01
    相关资源
    最近更新 更多