Одна проблема, которую я вижу с подходом Hackintosh, состоит в том, что, если Вы получаете его работающий теперь, у Вас, как гарантируют, не будет той же работы машины, когда обновление Mac OS выйдет в будущем, и это могло быть особенно важно, если iPhone SDK и/или инструменты разработчика, которые Вы хотите использовать, размещаются только на следующем поколении системного программного обеспечения.
В конечном счете, я думаю, что будет лучше пойти с дешевым (и даже используемый) Mac некоторого вида, как мини-или MacBook.
Просто примечание: вы можете использовать cache_sweeper
в ApplicationController.
class ApplicationController < ActionController::Base
cache_sweeper :my_sweeper
end
class MySweeper < ActionController::Caching::Sweeper
observe MyModel
def after_update(my_model)
expire_page(...)
end
end
Итак, я попробовал несколько разных подходов, чтобы увидеть, что работает, а что нет.
Опять же, резюмируя ситуацию: Моя цель - срок действия кэшированные страницы при обновлении объекта, но для их истечения срока действия, не полагаясь на действие контроллера. Обычные подметальные машины используют линию в контроллере, чтобы уведомить подметально-уборочную машину о том, что она должна работать. В этом случае я не могу использовать строку в контроллере, так как обновление происходит внутри модели. Обычные учебные пособия по очистке не работают, поскольку они предполагают, что ваше основное взаимодействие с объектом базы данных осуществляется через контроллер.
Если, читая это, вы увидите способ ужесточить мой код, прокомментируйте и дайте мне знать.
Во-первых, давайте посмотрим, что ДЕЙСТВИТЕЛЬНО работает, на случай, если вы тоже застряли в этом и нуждаетесь в помощи.
Из всего, что я пробовал, единственное, что действительно работало, - это объявить команду after_update в Observer для модели. В этой команде я использовал явную команду для действия expire_page и включил путь, который был объявлен в routes.rb.
Итак. Это работает:
В config / routes.rb:
map.link 'l/:md5.:format', :controller => 'links', :action => 'show'
В app / models / link_observer.rb:
def after_update(link)
ActionController::Base.expire_page(app.link_path(:md5 => link.md5))
end
Обратите внимание, что «md5» специфичен для моего приложения. Возможно, вы захотите использовать: id или какой-либо другой уникальный идентификатор.
Я также обнаружил, что объявление этой строки ActionController :: Base ... из метода в модели, выполняющей обновление, сработало. То есть в Link.rb, в методе, который фактически обновляет базу данных, если я просто вставил всю эту строку, это сработало. Но поскольку в будущем я, возможно, захочу истечь этот кеш страницы для других методов, я Я бы предпочел извлечь его в Observer.
Теперь давайте посмотрим на некоторые вещи, которые НЕ работали, на случай, если вы искали это в Google.
Вызов "expire_page (...)" внутри метод after_update (ссылка) в link_observer.rb не работал, так как он возвратил ошибку «undefined method ʻexpire_page '»
Создание файла Sweeper , который обнаружил, что Модель не работает. Я не мог найти никаких кодов ошибок, но казалось, что он даже не осознавал, что у него есть работа. Это произошло после явного вызова config.load_paths + =% W (# {RAILS_ROOT} / app / sweepers) в environment.rb. На случай, если я что-то нащупал в этом коде, вот он:
class LinkSweeper < ActionController::Caching::Sweeper
observe Link
def after_update(link)
clear_links_cache(link)
end
def clear_links_cache(link)
# DID NOT WORK expire_page :controller => 'links', :action => 'show', :md5 => link.md5
# DID NOT WORK expire_page '/l/'+ link.md5 + '.html'
# DID NOT WORK ActionController::Base.expire_page(app.link_path(:md5 => link.md5))
end
end
В приведенном выше примере файл link_sweeper.rb находился в каталоге / app / sweepers. Еще пробовал поставить link_sweeper. rb в каталоге app / models и попытался вызвать его с помощью команды config.active_record.observers в environment.rb:
config.active_record.observers = :link_observer, :link_sweeper
Но это тоже не сработало.
Итак, да. Вполне возможно, что один из этих методов сработает, и я что-то испортил в коде. Но я думаю, что делал все по правилам.
В конечном итоге, подведем итог: вместо использования Sweeper для истечения срока кэширования страниц вы хотите настроить обратный вызов after_ в Observer модели. Вы захотите использовать явный путь к методу Base.expire_page:
def after_update(<model>) # where <model> is the name of the model you're observing
ActionController::Base.expire_page(app.<model>_path(:id => <model>.id)) # where <model> is the name of the model you're observing
end
Надеюсь, это поможет кому-то еще в будущем. Опять же, если вы видите где-нибудь в моем неработающем коде, где я должен был сделать что-то по-другому, дайте мне знать. Если вы видите что-то в моем рабочем коде, которое может быть более жестким, сообщите мне и об этом.
и попытался вызвать его с помощью команды config.active_record.observers в environment.rb:config.active_record.observers = :link_observer, :link_sweeper
Но это тоже не сработало.
Так что да. Вполне возможно, что один из этих методов сработает, и я что-то испортил в коде. Но я думаю, что делал все по правилам.
В конечном итоге, подведем итог: вместо использования Sweeper для истечения срока кэширования страниц вы хотите настроить обратный вызов after_ в Observer модели. Вы захотите использовать явный путь к методу Base.expire_page:
def after_update(<model>) # where <model> is the name of the model you're observing
ActionController::Base.expire_page(app.<model>_path(:id => <model>.id)) # where <model> is the name of the model you're observing
end
Надеюсь, это поможет кому-то еще в будущем. Опять же, если вы видите где-нибудь в моем неработающем коде, где я должен был сделать что-то по-другому, дайте мне знать. Если вы заметите в моем рабочем коде что-то более жесткое, сообщите мне и об этом.
и попытался вызвать его с помощью команды config.active_record.observers в environment.rb:config.active_record.observers = :link_observer, :link_sweeper
Но это тоже не сработало.
Так что да. Вполне возможно, что один из этих методов сработает, и я что-то испортил в коде. Но я думаю, что делал все по правилам.
В конечном итоге, подведем итог: вместо использования Sweeper для истечения срока кэширования страниц вы хотите настроить обратный вызов after_ в Observer модели. Вы захотите использовать явный путь к методу Base.expire_page:
def after_update(<model>) # where <model> is the name of the model you're observing
ActionController::Base.expire_page(app.<model>_path(:id => <model>.id)) # where <model> is the name of the model you're observing
end
Надеюсь, это поможет кому-то еще в будущем. Опять же, если вы видите где-нибудь в моем неработающем коде, где я должен был сделать что-то по-другому, дайте мне знать. Если вы видите что-то в моем рабочем коде, которое может быть более жестким, сообщите мне и об этом.
config.active_record.observers = :link_observer, :link_sweeper
Но это тоже не сработало.
Итак, да. Вполне возможно, что один из этих методов сработает, и я что-то испортил в коде. Но я думаю, что делал все по правилам.
В конечном итоге, подведем итог: вместо использования Sweeper для истечения срока кэширования страниц вы хотите настроить обратный вызов after_ в Observer модели. Вы захотите использовать явный путь к методу Base.expire_page:
def after_update(<model>) # where <model> is the name of the model you're observing
ActionController::Base.expire_page(app.<model>_path(:id => <model>.id)) # where <model> is the name of the model you're observing
end
Надеюсь, это поможет кому-то еще в будущем. Опять же, если вы видите где-нибудь в моем неработающем коде, где я должен был сделать что-то по-другому, дайте мне знать. Если вы заметите в моем рабочем коде что-то более жесткое, сообщите мне и об этом.
config.active_record.observers = :link_observer, :link_sweeper
Но это тоже не сработало.
Итак, да. Вполне возможно, что один из этих методов сработает, и я что-то испортил в коде. Но я думаю, что делал все по правилам.
В конечном итоге, подведем итог: вместо использования Sweeper для истечения срока кэширования страниц вы хотите настроить обратный вызов after_ в Observer модели. Вы захотите использовать явный путь к методу Base.expire_page:
def after_update(<model>) # where <model> is the name of the model you're observing
ActionController::Base.expire_page(app.<model>_path(:id => <model>.id)) # where <model> is the name of the model you're observing
end
Надеюсь, это поможет кому-то еще в будущем. Опять же, если вы видите где-нибудь в моем неработающем коде, где я должен был сделать что-то по-другому, дайте мне знать. Если вы заметите в моем рабочем коде что-то более жесткое, сообщите мне и об этом.
Но я думаю, что делал все по правилам.В конечном итоге, подведем итог: вместо использования Sweeper для истечения срока кэширования страниц вы хотите настроить обратный вызов after_ в Observer модели. Вы захотите использовать явный путь к методу Base.expire_page:
def after_update(<model>) # where <model> is the name of the model you're observing
ActionController::Base.expire_page(app.<model>_path(:id => <model>.id)) # where <model> is the name of the model you're observing
end
Надеюсь, это поможет кому-то еще в будущем. Опять же, если вы видите где-нибудь в моем неработающем коде, где я должен был сделать что-то по-другому, дайте мне знать. Если вы видите что-то в моем рабочем коде, которое может быть более жестким, сообщите мне и об этом.
Но я думаю, что делал все по правилам.В конечном итоге, подведем итог: вместо использования Sweeper для истечения срока кэширования страниц вы хотите настроить обратный вызов after_ в Observer модели. Вы захотите использовать явный путь к методу Base.expire_page:
def after_update(<model>) # where <model> is the name of the model you're observing
ActionController::Base.expire_page(app.<model>_path(:id => <model>.id)) # where <model> is the name of the model you're observing
end
Надеюсь, это поможет кому-то еще в будущем. Опять же, если вы видите где-нибудь в моем неработающем коде, где я должен был сделать что-то по-другому, дайте мне знать. Если вы заметите в моем рабочем коде что-то более жесткое, сообщите мне и об этом.
если вы видите где-нибудь в моем неработающем коде, где я должен был сделать что-то по-другому, дайте мне знать. Если вы заметите в моем рабочем коде что-то более жесткое, сообщите мне и об этом. если вы видите где-нибудь в моем неработающем коде, где я должен был сделать что-то по-другому, сообщите мне. Если вы заметите в моем рабочем коде что-то более жесткое, сообщите мне и об этом.Мне удалось заставить его работать, добавив
ActionController::Base.expire_page(app.link_path(:md5 => @link.md5))
к методу в самой модели, который обновляет базу данных. Это выглядит несколько хакерским, и я хотел бы знать, сможет ли кто-нибудь объяснить, почему он не работает с обычной настройкой подметальной машины, и есть ли более элегантный способ справиться с этим.
Этот фрагмент кода ( помимо настроек, которые я внес в собственное приложение) взято из этого сообщения на ruby-forum.com .
У меня все заработало. Единственная небольшая разница в моей настройке состоит в том, что подметальная машина является частью движка Rails; что учитывает небольшие различия (загрузка файла очистки с требованием в init движка вместо добавления его в путь загрузки в environment.rb и т. д.).
Итак, очиститель загружается в init.rb движка следующим образом:
require File.join(File.dirname(__FILE__), 'app', 'sweepers', cached_category_count_sweeper')
Я назвал его очистителем, потому что он «очищает» кэш, но я предполагаю, что это всего лишь наблюдатель на модели:
class CachedCategoryCountSweeper < ActiveRecord::Observer
observe CategoryFeature
def before_save(cf)
expire_cache(cf.category_id_was) if cf.category_id_changed?
end
def after_save(cf)
expire_cache(cf.category_id)
end
def after_destroy(cf)
expire_cache(cf.category_id)
end
def expire_cache(c)
ApplicationController.expire_page("/categories/#{c}/counts.xml") if !c.nil?
end
end
Честно говоря, мне не нравится жестко запрограммировать путь, но я попытался добавить:
include ActionController:UrlWriter
, а затем использовать метод пути, но это сработало только у меня в разработке. Это не сработало в производственной среде, потому что мой производственный сервер использует корень относительного URL-адреса (вместо виртуальных хостов), а внутренний метод page_cache_path постоянно будет указывать неверный путь к файлу, поэтому срок его действия не может истечь.
Поскольку это наблюдатель, я добавил в environment.rb:
config.active_record.observers = :cached_category_count_sweeper
Наконец, контроллер, который использует кеш (не истекает его срок, это делается через наблюдателя модели):
class CachedCategoryCountsController < ApplicationController
caches_page :index
# GET /cached_category_counts.xml
def index
...
end
end
В любом случае, надеюсь, что это помогает.
Андрес Монтано