Spec-Zone.ru › Ruby on Rails 7.1

класс ActionView::Template

Родитель:
Объект

Шаблон Action View

Константы

NONE
STRICT_LOCALS_REGEX

Атрибуты

format[R]
frozen_string_literal[RW]
handler[R]
identifier[R]
variable[R]
variant[R]
virtual_path[R]

Публичные Классовые Методы

mime_types_implementation=(implementation) Показать исходный код
# File actionview/lib/action_view/template.rb, line 171
def mime_types_implementation=(implementation)
  # This method isn't thread-safe, but it's not supposed
  # to be called after initialization
  if self::Types != implementation
    remove_const(:Types)
    const_set(:Types, implementation)
  end
end
new(source, identifier, handler, locals:, format: nil, variant: nil, virtual_path: nil) Показать исходный код
# File actionview/lib/action_view/template.rb, line 186
def initialize(source, identifier, handler, locals:, format: nil, variant: nil, virtual_path: nil)
  @source            = source.dup
  @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
  @strict_locals     = NONE
  @strict_local_keys = nil
  @type              = nil
end

Публичные Методы Объектов

encode!() Показать исходный код
# File actionview/lib/action_view/template.rb, line 297
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!(LEADING_ENCODING_REGEXP, "")
    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). Это будет работать с любым движком шаблонов, так как мы обрабатываем комментарий кодировки перед передачей источника движку шаблонов, оставляя пустую строку вместо него.

inspect() Показать исходный код
# File actionview/lib/action_view/template.rb, line 276
def inspect
  "#<#{self.class.name} #{short_identifier} locals=#{locals.inspect}>"
end
local_assigns() Показать исходный код
# File actionview/lib/action_view/template.rb, line 152
eager_autoload do
  autoload :Error
  autoload :RawFile
  autoload :Renderable
  autoload :Handlers
  autoload :HTML
  autoload :Inline
  autoload :Types
  autoload :Sources
  autoload :Text
  autoload :Types
end

Возвращает хеш с определёнными локальными переменными.

При таком рендеринге подшаблона:

<%= render "application/header", { headline: "Welcome", person: person } %>

Вы можете использовать local_assigns в подшаблонах для доступа к локальным переменным:

local_assigns[:headline] # => "Welcome"

Каждый ключ в local_assigns доступен как частичная локальная переменная:

local_assigns[:headline] # => "Welcome"
headline                 # => "Welcome"

Так как local_assigns — это Hash, он совместим с оператором присваивания с помощью шаблона Ruby 3.1:

local_assigns => { headline:, **options }
headline                 # => "Welcome"
options                  # => {}

Присваивание с помощью шаблона также поддерживает переименование переменных:

local_assigns => { headline: title }
title                    # => "Welcome"

Если шаблон ссылается на переменную, которая не передана в представление в качестве части locals: { ... } Hash, шаблон вызовет ActionView::Template::Error:

<%# => raises ActionView::Template::Error %>
<% alerts.each do |alert| %>
  <p><%= alert %></p>
<% end %>

Так как local_assigns возвращает экземпляр Hash , вы можете условно прочитать переменную, а затем перейти к значению по умолчанию, когда ключ не входит в locals: { ... } опции:

<% local_assigns.fetch(:alerts, []).each do |alert| %>
  <p><%= alert %></p>
<% end %>

Комбинирование присваивания с использованием шаблона Ruby 3.1 с вызовами +Hash#with_defaults+ позволяет создавать компактные присваивания частичных локальных переменных:

<% local_assigns.with_defaults(alerts: []) => { headline:, alerts: } %>

<h1><%= headline %></h1>

<% alerts.each do |alert| %>
  <p><%= alert %></p>
<% end %>
locals() Показать исходный код
# File actionview/lib/action_view/template.rb, line 210
def locals
  if strict_locals?
    nil
  else
    @locals
  end
end

Локальные переменные, для которых был или будет скомпилирован этот шаблон, или nil, если это шаблон с жёсткими локальными переменными.

render(view, locals, buffer = nil, implicit_locals: [], add_to_stack: true, &block) Показать исходный код
# File actionview/lib/action_view/template.rb, line 248
def render(view, locals, buffer = nil, implicit_locals: [], add_to_stack: true, &block)
  instrument_render_template do
    compile!(view)

    if strict_locals? && @strict_local_keys && !implicit_locals.empty?
      locals_to_ignore = implicit_locals - @strict_local_keys
      locals.except!(*locals_to_ignore)
    end

    if buffer
      view._run(method_name, self, locals, buffer, add_to_stack: add_to_stack, has_strict_locals: strict_locals?, &block)
      nil
    else
      view._run(method_name, self, locals, OutputBuffer.new, add_to_stack: add_to_stack, has_strict_locals: strict_locals?, &block)&.to_s
    end
  end
rescue => e
  handle_render_error(view, e)
end

Рендеринг шаблона. Если шаблон ещё не был скомпилирован, это делается непосредственно перед рендерингом.

Этот метод инструментирован как «!render_template.action_view». Обратите внимание, что мы используем восклицательный знак в этой инструментации, так как вы не хотите использовать его в производстве. Он медленный только если на него подписываются.

short_identifier() Показать исходный код
# File actionview/lib/action_view/template.rb, line 272
def short_identifier
  @short_identifier ||= defined?(Rails.root) ? identifier.delete_prefix("#{Rails.root}/") : identifier
end
source() Показать исходный код
# File actionview/lib/action_view/template.rb, line 280
def source
  @source.to_s
end
strict_locals!() Показать исходный код
# File actionview/lib/action_view/template.rb, line 342
def strict_locals!
  if @strict_locals == NONE
    self.source.sub!(STRICT_LOCALS_REGEX, "")
    @strict_locals = $1

    return if @strict_locals.nil? # Magic comment not found

    @strict_locals = "**nil" if @strict_locals.blank?
  end

  @strict_locals
end

Этот метод отвечает за пометку шаблона как имеющего жёсткие локальные переменные, что означает, что шаблон может принимать только локальные переменные, определённые в магическом комментарии. Например, если ваш шаблон принимает локальные переменные title и comment_count, добавьте следующее в файл шаблона:

<%# locals: (title: "Default title", comment_count: 0) %>

Жёсткие локальные переменные полезны для проверки аргументов шаблона и для указания значений по умолчанию.

strict_locals?() Показать исходный код
# File actionview/lib/action_view/template.rb, line 356
def strict_locals?
  strict_locals!
end

Возвращает, использует ли шаблон жёсткие локальные переменные.

supports_streaming?() Показать исходный код
# File actionview/lib/action_view/template.rb, line 238
def supports_streaming?
  handler.respond_to?(:supports_streaming?) && handler.supports_streaming?
end

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

translate_location(backtrace_location, spot) Показать исходный код
# File actionview/lib/action_view/template.rb, line 228
def translate_location(backtrace_location, spot)
  if handler.respond_to?(:translate_location)
    handler.translate_location(spot, backtrace_location, encode!) || spot
  else
    spot
  end
end

Перевод расположения ошибки, возвращенной ErrorHighlight, в правильное расположение источника внутри шаблона.

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

Приватные Методы Объектов

instrument(action, &block) Показать исходный код
# File actionview/lib/action_view/template.rb, line 544
def instrument(action, &block) # :doc:
  ActiveSupport::Notifications.instrument("#{action}.action_view", instrument_payload, &block)
end

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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