Spec-Zone.ru › Ruby on Rails 5.2

класс ActionView::Template

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

Шаблон Action View Шаблон

Атрибуты

formats[RW]
handler[R]
identifier[R]
locals[RW]
original_encoding[R]
source[R]
updated_at[R]
variants[RW]
virtual_path[RW]

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

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

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

encode!() Показать исходный код
# 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

Этот метод отвечает за правильное установление кодировки источника. До этого момента мы предполагаем, что источник — это данные BINARY. Если дополнительная информация не предоставлена, мы предполагаем, что кодировка такая же, как Encoding.default_external.

Пользователь также может указать кодировку через комментарий в первой строке шаблона (# encoding: ИМЯ-КОДИРОВКИ). Это будет работать с любым движком шаблонов, так как мы обрабатываем комментарий с кодировкой перед передачей источника движку шаблонов, заменяя его пустой строкой.

inspect() Показать исходный код
# File actionview/lib/action_view/template.rb, line 188
def inspect
  @inspect ||= defined?(Rails.root) ? identifier.sub("#{Rails.root}/", "".freeze) : identifier
end
local_assigns() Показать исходный код
# 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"
refresh(view) Показать исходный код
# 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

Принимает объект представления и возвращает шаблон, аналогичный self, используя @virtual_path.

Этот метод полезен, если у вас есть объект шаблона, но он больше не содержит свой источник, так как уже был скомпилирован. В таких случаях вам нужно вызвать refresh, передав объект представления.

Обратите внимание, что этот метод вызывает ошибку, если шаблон, который нужно обновить, не имеет установленного виртуального пути (только для встроенных шаблонов).

render(view, locals, buffer = nil, &block) Показать исходный код
# File actionview/lib/action_view/template.rb, line 156
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

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

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

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

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

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

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

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

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

Spec-Zone.ru

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