Spec-Zone.ru › Ruby on Rails 5.1

class ActionView::Template

Parent:
Объект

Action View Шаблон

Action View Шаблон

Action View HTML Шаблон

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 126
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 200
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: NAME-OF-ENCODING). Это будет работать с любым движком шаблонов, так как мы обрабатываем комментарий с кодировкой перед передачей источника в движок шаблонов, оставляя пустую строку вместо него.

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

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

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

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

instrument(action, &block) Показать исходный код
# File actionview/lib/action_view/template.rb, line 347
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