Как вызвать рельсовую подметальную машину в этом сценарии? - PullRequest
0 голосов
/ 20 января 2012

Как видно из кода ниже. Я кеширую действие show. У меня также есть следующий метод в действии show View.create_for(@song).

Я бы хотел, чтобы при вызове View.create_for(@song) очищался соответствующий кеш.

Как бы я поступил по этому поводу? Нужно ли вручную вызывать подметальную машину в модели View? Если да, то как?

Мой контроллер:

class SongsController < ApplicationController
  caches_action :show, :cache_path => (proc do 
    song_path(params[:id], :user_id => user_signed_in? ? current_user.id : nil)
  end)

  # I tried with the following line, but this is not what I want. I only want to call the sweeper when `View.create_for(@song)` is called:
  # cache_sweeper :views_sweeper, :only => [:show]

  def show
    @song = Song.find(params[:id])
    View.create_for(@song)
  end
end

Мой Sweeper:

class SongsSweeper < ActionController::Caching::Sweeper
  observe Song

  def after_save(song)
    expire_fragment(/songs\/#{song.id}\/.*?/)
  end
end

1 Ответ

1 голос
/ 22 января 2012

Я думаю, что вы должны ссылаться на songs_sweeper, а не views_sweeper:

cache_sweeper :songs_sweeper, :only => [:show]

Я не уверен в ваших требованиях, но вы также можете быть более конкретным в вашем SongsSweeper, изменив after_save на after_create:

class SongsSweeper < ActionController::Caching::Sweeper
  observe Song

  def after_create(song)
    expire_fragment(/songs\/#{song.id}\/.*?/)
  end
end
...