класс ActionView::Template
Action View Шаблон
Action View Шаблон
Action View HTML Шаблон
Action View Текстовый Шаблон
Константы
- Finalizer
-
Этот финализатор необходим (и именно с проком внутри другого прока), иначе шаблоны утекут в разработке.
Атрибуты
Общедоступные методы класса
# File actionview/lib/action_view/template.rb, line 114
def initialize(source, identifier, handler, details)
format = details[:format] || (handler.default_format if handler.respond_to?(:default_format))
@source = source
@identifier = identifier
@handler = handler
@compiled = false
@original_encoding = nil
@locals = details[:locals] || []
@virtual_path = details[:virtual_path]
@updated_at = details[:updated_at] || Time.now
@formats = Array(format).map { |f| f.respond_to?(:ref) ? f.ref : f }
@variants = [details[:variant]]
@compile_mutex = Mutex.new
end Общедоступные методы экземпляра
# File actionview/lib/action_view/template.rb, line 188
def encode!
return unless source.encoding == Encoding::BINARY
# Look for # encoding: *. If we find one, we'll encode the
# String in that encoding, otherwise, we'll use the
# default external encoding.
if source.sub!(/\A#{ENCODING_FLAG}/, '')
encoding = magic_encoding = $1
else
encoding = Encoding.default_external
end
# Tag the source with the default external encoding
# or the encoding specified in the file
source.force_encoding(encoding)
# If the user didn't specify an encoding, and the handler
# handles encodings, we simply pass the String as is to
# the handler (with the default_external tag)
if !magic_encoding && @handler.respond_to?(:handles_encoding?) && @handler.handles_encoding?
source
# Otherwise, if the String is valid in the encoding,
# encode immediately to default_internal. This means
# that if a handler doesn't handle encodings, it will
# always get Strings in the default_internal
elsif source.valid_encoding?
source.encode!
# Otherwise, since the String is invalid in the encoding
# specified, raise an exception
else
raise WrongEncodingError.new(source, encoding)
end
end Этот метод отвечает за правильную установку кодировки источника. До этого момента мы предполагаем, что источник — данные в формате BINARY. Если дополнительная информация не предоставлена, мы предполагаем, что кодировка такая же, как Encoding.default_external.
Пользователь также может указать кодировку с помощью комментария в первой строке шаблона (# encoding: NAME-OF-ENCODING). Это будет работать с любым движком шаблонов, так как мы обрабатываем комментарий о кодировке перед передачей источника в движок шаблонов, оставляя пустую строку вместо него.
# File actionview/lib/action_view/template.rb, line 174
def inspect
@inspect ||= defined?(Rails.root) ? identifier.sub("#{Rails.root}/", '') : identifier
end # File actionview/lib/action_view/template.rb, line 163
def refresh(view)
raise "A template needs to have a virtual path in order to be refreshed" unless @virtual_path
lookup = view.lookup_context
pieces = @virtual_path.split("/")
name = pieces.pop
partial = !!name.sub!(/^_/, "")
lookup.disable_cache do
lookup.find_template(name, [ pieces.join('/') ], partial, @locals)
end
end Получает объект представления и возвращает шаблон, похожий на self, используя @virtual_path.
Этот метод полезен, если у вас есть объект шаблона, но он больше не содержит своего источника, так как он уже был скомпилирован. В таких случаях все, что вам нужно сделать, это вызвать refresh, передав объект представления.
Обратите внимание, что этот метод генерирует ошибку, если шаблон, который нужно обновить, не имеет установленного виртуального пути (только для встроенных шаблонов).
# File actionview/lib/action_view/template.rb, line 142
def render(view, locals, buffer=nil, &block)
instrument("!render_template") do
compile!(view)
view.send(method_name, locals, buffer, &block)
end
rescue => e
handle_render_error(view, e)
end Отобразить шаблон. Если шаблон еще не скомпилирован, это делается непосредственно перед отображением.
Этот метод инструментирован как “!render_template.action_view”. Обратите внимание, что мы используем восклицательный знак в этой инструментизации, потому что вам не нужно это использовать в производстве. Это медленное выполнение только если оно отслеживается.
# File actionview/lib/action_view/template.rb, line 132 def supports_streaming? handler.respond_to?(:supports_streaming?) && handler.supports_streaming? end
Возвращает, поддерживает ли базовый обработчик потоков. Если да, то буфер потока может быть передан при его начальном отображении.
# File actionview/lib/action_view/template.rb, line 151 def type @type ||= Types[@formats.first] if @formats.first end
Защищенные методы экземпляра
# File actionview/lib/action_view/template.rb, line 331
def instrument(action, &block)
payload = { virtual_path: @virtual_path, identifier: @identifier }
ActiveSupport::Notifications.instrument("#{action}.action_view", payload, &block)
end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.