В направляющих Либеро не становится вызванным в установке Только для модели

Одна проблема, которую я вижу с подходом Hackintosh, состоит в том, что, если Вы получаете его работающий теперь, у Вас, как гарантируют, не будет той же работы машины, когда обновление Mac OS выйдет в будущем, и это могло быть особенно важно, если iPhone SDK и/или инструменты разработчика, которые Вы хотите использовать, размещаются только на следующем поколении системного программного обеспечения.

В конечном счете, я думаю, что будет лучше пойти с дешевым (и даже используемый) Mac некоторого вида, как мини-или MacBook.

10
задан charliepark 23 September 2009 в 02:46
поделиться

4 ответа

Просто примечание: вы можете использовать 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
5
ответ дан 3 December 2019 в 18:34
поделиться

Итак, я попробовал несколько разных подходов, чтобы увидеть, что работает, а что нет.

Опять же, резюмируя ситуацию: Моя цель - срок действия кэшированные страницы при обновлении объекта, но для их истечения срока действия, не полагаясь на действие контроллера. Обычные подметальные машины используют линию в контроллере, чтобы уведомить подметально-уборочную машину о том, что она должна работать. В этом случае я не могу использовать строку в контроллере, так как обновление происходит внутри модели. Обычные учебные пособия по очистке не работают, поскольку они предполагают, что ваше основное взаимодействие с объектом базы данных осуществляется через контроллер.

Если, читая это, вы увидите способ ужесточить мой код, прокомментируйте и дайте мне знать.

Во-первых, давайте посмотрим, что ДЕЙСТВИТЕЛЬНО работает, на случай, если вы тоже застряли в этом и нуждаетесь в помощи.

Из всего, что я пробовал, единственное, что действительно работало, - это объявить команду 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

Надеюсь, это поможет кому-то еще в будущем. Опять же, если вы видите где-нибудь в моем неработающем коде, где я должен был сделать что-то по-другому, дайте мне знать. Если вы заметите в моем рабочем коде что-то более жесткое, сообщите мне и об этом.

если вы видите где-нибудь в моем неработающем коде, где я должен был сделать что-то по-другому, дайте мне знать. Если вы заметите в моем рабочем коде что-то более жесткое, сообщите мне и об этом.

если вы видите где-нибудь в моем неработающем коде, где я должен был сделать что-то по-другому, сообщите мне. Если вы заметите в моем рабочем коде что-то более жесткое, сообщите мне и об этом.

11
ответ дан 3 December 2019 в 18:34
поделиться

Мне удалось заставить его работать, добавив

ActionController::Base.expire_page(app.link_path(:md5 => @link.md5))

к методу в самой модели, который обновляет базу данных. Это выглядит несколько хакерским, и я хотел бы знать, сможет ли кто-нибудь объяснить, почему он не работает с обычной настройкой подметальной машины, и есть ли более элегантный способ справиться с этим.

Этот фрагмент кода ( помимо настроек, которые я внес в собственное приложение) взято из этого сообщения на ruby-forum.com .

0
ответ дан 3 December 2019 в 18:34
поделиться

У меня все заработало. Единственная небольшая разница в моей настройке состоит в том, что подметальная машина является частью движка 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

В любом случае, надеюсь, что это помогает.

Андрес Монтано

2
ответ дан 3 December 2019 в 18:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: