класс ActionView::Template
Action View Шаблон
Action View Шаблон
Action View HTML Шаблон
Action View Текстовый Шаблон
Атрибуты
Открытые методы класса
# File actionview/lib/action_view/template.rb, line 128
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 202
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 Этот метод отвечает за правильную установку кодировки исходника. До этого момента мы предполагаем, что исходник — это двоичные данные. Если дополнительной информации нет, мы предполагаем, что кодировка такая же, как Encoding.default_external.
Пользователь также может указать кодировку через комментарий в первой строке шаблона (# encoding: ИМЯ_КОДИРОВКИ). Это будет работать с любым движком шаблонов, так как мы обрабатываем комментарий кодировки перед передачей исходника движку шаблонов, оставляя вместо него пустую строку.
# File actionview/lib/action_view/template.rb, line 188
def inspect
@inspect ||= defined?(Rails.root) ? identifier.sub("#{Rails.root}/", ''.freeze) : identifier
end # File actionview/lib/action_view/template.rb, line 104 eager_autoload do autoload :Error autoload :Handlers autoload :HTML autoload :Text autoload :Types end
Возвращает хеш с определёнными локальными переменными.
Представьте, что рендерится этот вложенный шаблон:
<%= render "shared/header", { headline: "Welcome", person: person } %> В вложенных шаблонах можно использовать local_assigns для доступа к локальным переменным:
local_assigns[:headline] # => "Welcome"
# File actionview/lib/action_view/template.rb, line 177
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 Принимает объект представления и возвращает шаблон, похожий на себя, используя @virtual_path.
Этот метод полезен, если у вас есть объект шаблона, но он больше не содержит своего исходника, так как уже был скомпилирован. В таких случаях достаточно вызвать обновление, передав объект представления.
Обратите внимание, что этот метод генерирует ошибку, если обновляемый шаблон не имеет установленного виртуального пути (только для встроенных шаблонов).
# File actionview/lib/action_view/template.rb, line 156
def render(view, locals, buffer=nil, &block)
instrument("!render_template".freeze) 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 146 def supports_streaming? handler.respond_to?(:supports_streaming?) && handler.supports_streaming? end
Возвращает, поддерживает ли обработчик потоков. В таком случае буфер потоков может быть передан при его запуске.
# File actionview/lib/action_view/template.rb, line 165 def type @type ||= Types[@formats.first] if @formats.first end
Защищенные методы экземпляра
# File actionview/lib/action_view/template.rb, line 350
def instrument(action, &block)
payload = { virtual_path: @virtual_path, identifier: @identifier }
case action
when "!render_template".freeze
ActiveSupport::Notifications.instrument("!render_template.action_view".freeze, payload, &block)
else
ActiveSupport::Notifications.instrument("#{action}.action_view".freeze, payload, &block)
end
end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.