class ActionView::Template
Action View Template
Action View Renderable Template for objects that respond to render_in
Атрибуты
Публичные методы класса
# File actionview/lib/action_view/template.rb, line 120
def initialize(source, identifier, handler, locals:, format: nil, variant: nil, virtual_path: nil)
@source = source
@identifier = identifier
@handler = handler
@compiled = false
@locals = locals
@virtual_path = virtual_path
@variable = if @virtual_path
base = @virtual_path.end_with?("/") ? "" : ::File.basename(@virtual_path)
base =~ /\A_?(.*?)(?:\.\w+)*\z/
$1.to_sym
end
@format = format
@variant = variant
@compile_mutex = Mutex.new
end Публичные методы экземпляра
# File actionview/lib/action_view/template.rb, line 186
def encode!
source = self.source
return source 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: ИМЯ_КОДИРОВКИ). Это будет работать с любым движком шаблонов, поскольку мы обрабатываем комментарий кодировки перед передачей источника движку шаблонов, заменяя его пустой строкой.
# File actionview/lib/action_view/template.rb, line 168
def inspect
"#<#{self.class.name} #{short_identifier} locals=#{@locals.inspect}>"
end # File actionview/lib/action_view/template.rb, line 103 eager_autoload do autoload :Error autoload :RawFile autoload :Renderable autoload :Handlers autoload :HTML autoload :Inline autoload :Sources 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 151
def render(view, locals, buffer = ActionView::OutputBuffer.new, add_to_stack: true, &block)
instrument_render_template do
compile!(view)
view._run(method_name, self, locals, buffer, add_to_stack: add_to_stack, &block)
end
rescue => e
handle_render_error(view, e)
end Рендеринг шаблона. Если шаблон ещё не был скомпилирован, это делается непосредственно перед рендерингом.
Этот метод инструментирован как «!render_template.action_view». Обратите внимание, что мы используем восклицательный знак в этой инструментизации, потому что вы не хотите использовать это в производстве. Это медленное только если оно прослушивается.
# File actionview/lib/action_view/template.rb, line 164
def short_identifier
@short_identifier ||= defined?(Rails.root) ? identifier.delete_prefix("#{Rails.root}/") : identifier
end # File actionview/lib/action_view/template.rb, line 172 def source @source.to_s end
# File actionview/lib/action_view/template.rb, line 141 def supports_streaming? handler.respond_to?(:supports_streaming?) && handler.supports_streaming? end
Возвращает, поддерживает ли базовый обработчик потоковую передачу. Если да, буфер потоковой передачи может быть передан при начале рендеринга.
# File actionview/lib/action_view/template.rb, line 160 def type @type ||= Types[format] end
Приватные методы экземпляра
# File actionview/lib/action_view/template.rb, line 340
def instrument(action, &block) # :doc:
ActiveSupport::Notifications.instrument("#{action}.action_view", instrument_payload, &block)
end
© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.