在观察者中使用rails expire_action?

时间:2011-08-16 13:13:53

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

唉。不是我今天的日子。

我在Rails 3.0x应用程序中有一个观察者

class EventObserver < ActionController::Caching::Sweeper
  observe :live_event, :event

  def after_update(event)
    Rails.logger.debug "EventObserver::after_update #{event.class.name}.#{event.id}"
    channels = Channel.being_used
    inc=channels.reject {|c| !c.current_source.events.include?(event) }
    inc.each do |c|
      expire_action("channel_tickers/#{c.id}.js")
      expire_action("channel_events/#{c.id}.js")
      Rails.logger.debug "expired stuff for channel #{c.id}"
    end
  end
end

我对其中一个观察类进行了更新,并且调用了after_update,但它没有过期。我在日志中看不到对expire_action的调用。

我确实看到了:

expired stuff for channel 63

所以它正在击中代码而不是轰炸。

我想使用观察者,因为这些模型不是从控制器更新,而是在内部。

1 个答案:

答案 0 :(得分:1)

经过一些拖钓,我找到了答案。我将这一行添加到'after_update'方法的开头:

@controller ||= ActionController::Base.new # <= this line is the key! without this nothing works

你不会得到任何例外,但如果不这样做,它就不起作用。我想在某个地方,它正在寻找@controller是否存在,如果有的话。