4

Rails アプリケーションには次のスイーパーがあります。

class AgencyEquipmentTypeSweeper < ActionController::Caching::Sweeper 
  observe AgencyEquipmentType

  #include ExpireOptions
  def after_update(agency_equipment_type)
    expire_options(agency_equipment_type)
  end

  def after_delete(agency_equipment_type)
    expire_options(agency_equipment_type)
  end

  def after_create(agency_equipment_type)
    expire_options(agency_equipment_type)
  end

  def expire_options(agency_equipment_type)
    Rails.cache.delete("agency_equipment_type_options/#{agency_equipment_type.agency_id}")
  end
end

「ExpireOptions」というモジュールへの after_update、after_delete、および after_create コールバックを抽出したいと考えています。

モジュール次のようになります (「expire_options」メソッドは元のスイーパーの後ろに残ります):

module ExpireOptions
  def after_update(record)
    expire_options(record)
  end

  def after_delete(record)
    expire_options(record)
  end

  def after_create(record)
    expire_options(record)
  end
end

class AgencyEquipmentTypeSweeper < ActionController::Caching::Sweeper 
  observe AgencyEquipmentType

  include ExpireOptions

  def expire_options(agency_equipment_type)
    Rails.cache.delete("agency_equipment_type_options/#{agency_equipment_type.agency_id}")
  end
end

ただし、キャッシュの有効期限は、スイーパー内でメソッドを明示的に定義した場合にのみ機能します。これらのコールバック メソッドをモジュールに抽出し、引き続き機能させる簡単な方法はありますか?

4

2 に答える 2

2

試してみてください:

module ExpireOptions
  def self.included(base)
    base.class_eval do
      after_update :custom_after_update
      after_delete :custom_after_delete
      after_create :custom_after_create
    end
  end

  def custom_after_update(record)
    expire_options(record)
  end

  def custom_after_delete(record)
    expire_options(record)
  end

  def custom_after_create(record)
    expire_options(record)
  end
end
于 2011-05-29T07:00:25.493 に答える
0

私は次のようなことを試します:

module ExpireOptions
  def after_update(record)
    self.send(:expire_options, record)
  end

  def after_delete(record)
    self.send(:expire_options, record)
  end

  def after_create(record)
    self.send(:expire_options, record)
  end
end

これにより、モジュールでこれらのメソッドを呼び出そうとしないようにする必要がありますselfが、呼び出し元のオブジェクトであることが望ましいです。

それは役に立ちますか?

于 2011-05-31T14:06:26.873 に答える