Spec-Zone.ru › Ruby on Rails 6.1

class ActionView::Template

Parent:
Object

Action View Template

Action View Renderable Template for objects that respond to render_in

Атрибуты

format[R]
handler[R]
identifier[R]
locals[R]
variable[R]
variant[R]
virtual_path[R]

Публичные методы класса

new(source, identifier, handler, locals:, format: nil, variant: nil, virtual_path: nil) Показать исходный код
# 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

Публичные методы экземпляра

encode!() Показать исходный код
# 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: ИМЯ_КОДИРОВКИ). Это будет работать с любым движком шаблонов, поскольку мы обрабатываем комментарий кодировки перед передачей источника движку шаблонов, заменяя его пустой строкой.

inspect() Показать исходный код
# File actionview/lib/action_view/template.rb, line 168
def inspect
  "#<#{self.class.name} #{short_identifier} locals=#{@locals.inspect}>"
end
local_assigns() Показать исходный код
# 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"
render(view, locals, buffer = ActionView::OutputBuffer.new, add_to_stack: true, &block) Показать исходный код
# 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». Обратите внимание, что мы используем восклицательный знак в этой инструментизации, потому что вы не хотите использовать это в производстве. Это медленное только если оно прослушивается.

short_identifier() Показать исходный код
# File actionview/lib/action_view/template.rb, line 164
def short_identifier
  @short_identifier ||= defined?(Rails.root) ? identifier.delete_prefix("#{Rails.root}/") : identifier
end
source() Показать исходный код
# File actionview/lib/action_view/template.rb, line 172
def source
  @source.to_s
end
supports_streaming?() Показать исходный код
# File actionview/lib/action_view/template.rb, line 141
def supports_streaming?
  handler.respond_to?(:supports_streaming?) && handler.supports_streaming?
end

Возвращает, поддерживает ли базовый обработчик потоковую передачу. Если да, буфер потоковой передачи может быть передан при начале рендеринга.

type() Показать исходный код
# File actionview/lib/action_view/template.rb, line 160
def type
  @type ||= Types[format]
end

Приватные методы экземпляра

instrument(action, &block) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API