класс ActiveSupport::FileUpdateChecker
FileUpdateChecker определяет API, используемый Rails для отслеживания файлов и управления перезагрузкой. API зависит от четырёх методов:
-
initializeкоторый принимает два параметра и один блок, как описано ниже. -
updated?который возвращает булево значение, если в файловой системе произошли изменения или нет. -
executeкоторый выполняет заданный блок при инициализации и обновляет последние отслеживаемые файлы и метку времени. -
execute_if_updatedкоторый просто выполняет блок, если он был обновлён.
После инициализации вызов execute_if_updated должен выполнить блок только в случае реальных изменений в файловой системе.
Этот класс используется Rails для перезагрузки фреймворка I18n всякий раз, когда они изменяются при новом запросе.
i18n_reloader = ActiveSupport::FileUpdateChecker.new(paths) do I18n.reload! end ActionDispatch::Reloader.to_prepare do i18n_reloader.execute_if_updated end
Общедоступные методы класса
При инициализации принимает два параметра. Первый — массив файлов, а второй — необязательный хэш каталогов. В хэше ключи — каталоги, а значение — массив расширений, которые будут отслеживаться в этом каталоге.
Этот метод также должен принимать блок, который будет вызываться при изменении пути. Массив файлов и список каталогов не могут быть изменены после инициализации FileUpdateChecker.
# File activesupport/lib/active_support/file_update_checker.rb, line 38
def initialize(files, dirs={}, &block)
@files = files.freeze
@glob = compile_glob(dirs)
@block = block
@watched = nil
@updated_at = nil
@last_watched = watched
@last_update_at = updated_at(@last_watched)
end Общедоступные методы экземпляра
Выполняет заданный блок и обновляет последние отслеживаемые файлы и метку времени.
# File activesupport/lib/active_support/file_update_checker.rb, line 72 def execute @last_watched = watched @last_update_at = updated_at(@last_watched) @block.call ensure @watched = nil @updated_at = nil end
Выполнить блок, если произошли изменения.
# File activesupport/lib/active_support/file_update_checker.rb, line 82
def execute_if_updated
if updated?
execute
true
else
false
end
end Проверить, были ли обновлены какие-либо записи. В таком случае значения watched и/или updated_at кэшируются до выполнения блока с помощью execute или execute_if_updated.
# File activesupport/lib/active_support/file_update_checker.rb, line 53
def updated?
current_watched = watched
if @last_watched.size != current_watched.size
@watched = current_watched
true
else
current_updated_at = updated_at(current_watched)
if @last_update_at < current_updated_at
@watched = current_watched
@updated_at = current_updated_at
true
else
false
end
end
end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.