class 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 ActiveSupport::Reloader.to_prepare do i18n_reloader.execute_if_updated end
Общедоступные методы класса
# File activesupport/lib/active_support/file_update_checker.rb, line 44
def initialize(files, dirs = {}, &block)
unless block
raise ArgumentError, "A block is required to initialize a FileUpdateChecker"
end
gem_paths = Gem.path
@files = files.reject { |file| File.expand_path(file).start_with?(*gem_paths) }.freeze
@globs = compile_glob(dirs)&.reject { |dir| dir.start_with?(*gem_paths) }
@block = block
@watched = nil
@updated_at = nil
@last_watched = watched
@last_update_at = updated_at(@last_watched)
end При инициализации метод принимает два параметра. Первый — массив файлов, а второй — необязательный хеш каталогов. Ключами хеша должны быть каталоги, а значениями — массив расширений файлов, которые нужно отслеживать в соответствующем каталоге.
Методу также необходимо передать блок, который будет вызван при изменении пути. Массив файлов и список каталогов нельзя изменить после инициализации FileUpdateChecker.
Общедоступные методы экземпляра
# File activesupport/lib/active_support/file_update_checker.rb, line 85 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 95
def execute_if_updated
if updated?
yield if block_given?
execute
true
else
false
end
end Выполняет переданный блок, если произошло обновление.
# File activesupport/lib/active_support/file_update_checker.rb, line 66
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 Проверяет, были ли обновлены какие-либо элементы. Если да, значения watched и/или updated_at кэшируются до выполнения блока через execute или execute_if_updated.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.