【问题标题】:Rails - Expiring Cached Actions from Resque (a Delayed Job alternative)Rails - Resque 中的过期缓存操作(延迟作业替代方案)
【发布时间】:2012-03-16 06:26:18
【问题描述】:

我有 Resque 队列,它处理特定模型以进行一些后期处理。更新此模型后,我想使缓存的视图操作过期。

我有一个 Sweeper 设置和工作,但它只观察控制器操作中对模型所做的更改。

我知道让我的模型中的缓存项过期并不是非常 MVC,但我的所有后处理逻辑都包含在我的模型中。

理想情况下,我不希望我的缓存破坏代码加倍,所以如果我可以让我现有的清扫器观察模型更改,那将是理想的。

或者,我会满足于从我的模型或模型观察者内部过期动作缓存。

p.s.:我可以从我设置的模型观察者中过期缓存片段,但不能过期。

我真的很想知道这里的最佳做法是什么。我确定我不是唯一一个有这个要求的人。

谢谢。

我想知道这样的事情是否可行:

http://dev.mensfeld.pl/2011/07/rails-wykorzystywanie-sweeperow-poza-kontrolerami-na-samych-modelach/

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 delayed-job resque


    【解决方案1】:

    由于我无法在您链接到的那个网站上添加我的评论。我把它放在这里:

    在 Rails 3.1.3 中,如果您实例化控制器,然后尝试调用 expire_fragment,您将收到有关尝试在 NilClass 上调用 host 的错误。

    经过一些实验,我记得功能测试可以实例化您的控制器。于是我把实例化代码改成了:

    @controller ||= ApplicationController.new
    
    if @controller.request.nil?
          @controller.request = ActionDispatch::TestRequest.new
    end
    

    这似乎有效,即使在生产中,甚至使用 rails 控制台。

    【讨论】:

      【解决方案2】:

      最后我想出了以下解决方案:

      将我现有的清扫器添加到 application.rb 中的对象观察者列表中:

      config.active_record.observers = :app_sweeper
      

      在清扫器方法中添加了代码,以在清扫器中缺少 @controller 对象时实例化它(这是通过对象而不是控制器来时发生的情况)。

      @controller ||= ActionController::Base.new
      

      然后我可以使用 expire_fragment 方法使缓存的操​​作过期,并带有以下花絮。

      expire_fragment("#{ActionMailer::Base.default_url_options[:host]}/items/#{item.id}")
      

      也就是说,如果 mj1531 的答案意味着我可以使用 expire_action 方法而不是用 expire 片段伪造它,它可能会被证明是一个更好的解决方案。我会在测试后报告并选择最佳答案。

      【讨论】:

        猜你喜欢
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-28
        • 2013-11-26
        • 1970-01-01
        • 2011-06-10
        • 1970-01-01
        相关资源
        最近更新 更多