class 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 Публичные методы экземпляра
Этот метод отвечает за правильное задание кодировки исходного текста. До этого момента мы предполагаем, что исходный текст — это двоичные данные. Если нет дополнительной информации, мы предполагаем, что кодировка такая же, как Encoding.default_external.
Пользователь также может указать кодировку с помощью комментария в первой строке шаблона (# encoding: ИМЯ_КОДИРОВКИ). Это будет работать с любым движком шаблонов, так как мы обрабатываем комментарий кодировки перед передачей исходного текста в движок шаблонов, оставляя пустую строку вместо него.
# 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 # File actionview/lib/action_view/template.rb, line 174
def inspect
@inspect ||= defined?(Rails.root) ? identifier.sub("#{Rails.root}/", '') : identifier
end Получает объект представления и возвращает шаблон, похожий на self, используя @virtual_path.
Этот метод полезен, если у вас есть объект шаблона, но он больше не содержит исходного кода, поскольку он уже был скомпилирован. В таких случаях вам нужно вызвать refresh, передав в него объект представления.
Обратите внимание, что этот метод вызывает ошибку, если шаблон, который нужно обновить, не имеет установленного виртуального пути (истина только для встроенных шаблонов).
# 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 Отобразить шаблон. Если шаблон еще не был скомпилирован, это делается непосредственно перед отображением.
Этот метод инструментирован как «!render_template.action_view». Обратите внимание, что мы используем восклицательный знак в этой инструментации, потому что вы не хотите потреблять это в продакшене. Это медленное только если за ним следят.
# 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 Возвращает значение, если подлежащий обработке обработчик поддерживает потоковую передачу. Если да, буфер потоковой передачи может быть передан при его запуске.
# 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 337
def instrument(action, &block)
payload = { virtual_path: @virtual_path, identifier: @identifier }
ActiveSupport::Notifications.instrument("#{action}.action_view", payload, &block)
end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.