1

Rails 3.2.8、ruby 1.9.3p0 (2011-10-30 リビジョン 33570) [x86_64-linux]

メソッドを使用して別のスイーパー内でスイーパーを使用するとinstance、スイーパー関数(のような after_update)が実行されます(ログを作成して実行されます)が、プロジェクトで何も期限切れになりません。(またはタスク)

私のコードは次のとおりです。

class WorkSweeper < ActionController::Caching::Sweeper
  # ...
  def after_update(work)
    expire work, "/works/index"
    expire work, "/tasks/#{work.task_id}/works/index"

    expire work, "/works/#{work.id}/show"

    TaskSweeper.instance.after_update work.task
  end
  # ...
end

class TaskSweeper < ActionController::Caching::Sweeper
  # ...
  def after_update(task)
    expire task, "/tasks/index"
    expire task, "/milestones/#{task.target_id}/tasks/index"
    expire task, "/tasks/#{task.target_id}/tasks/index"
    expire task, "/projects/#{task.target_id}/tasks/index"

    expire task, "/tasks/#{task.id}/show"

    MilestoneSweeper.instance.after_update task.target if task.target.class == Milestone
  end
  # ...
end

class MilestoneSweeper < ActionController::Caching::Sweeper
  # ...
  def after_update(milestone)
    expire milestone, "/milestones/index"
    expire milestone, "/projects/#{milestone.project_id}/milestones/index"

    expire milestone, "/milestones/#{milestone.id}/show"

    ProjectSweeper.instance.after_update milestone.project
  end
  # ...
end

class ProjectSweeper < ActionController::Caching::Sweeper
  # ...
  def after_update(project)
    expire project, "/projects/index"
    expire project, "/companies/#{project.company_id}/projects/index"

    expire project, "/projects/#{project.id}/show"
  end
  # ...
end

注:expireは次の関数です

def scope(project)
  project.creator.try(:creator_id) || project.creator_id
end

def expire(model, url)
  expire_fragment("#{scope model}#{url}")
end

次のように、各スイーパーで各有効期限を手動で実行する必要があります。

class WorkSweeper < ActionController::Caching::Sweeper
  # ...
  def after_update(work)
    expire work, "/works/index"
    expire work, "/tasks/#{work.task_id}/works/index"

    expire work, "/works/#{work.id}/show"

    expire project, "/projects/index"
    expire project, "/companies/#{project.company_id}/projects/index"

    expire project, "/projects/#{project.id}/show"
  end
  # ...
end

この場合、うまくいきますが、最善ではありません。私はたくさんのモデルとたくさんのスイーパーを持っています。

なにが問題ですか?同じことをする別の方法はありますか?

ありがとう。

解決済み

ここで答えてください https://github.com/rails/rails/issues/8096

4

0 に答える 0