Spec-Zone.ru › Ruby on Rails 5.0

класс ActionView::Template

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

Action View Шаблон

Action View Шаблон

Action View HTML Шаблон

Action View Текстовый Шаблон

Атрибуты

форматы[RW]
обработчик[R]
идентификатор[R]
локальные_переменные[RW]
исходная_кодировка[R]
исходник[R]
обновлено_в[R]
варианты[RW]
виртуальный_путь[RW]

Открытые методы класса

новый(исходник, идентификатор, обработчик, детали) Показать исходный код
# 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

Открытые методы экземпляра

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

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

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

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

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

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

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

рендерить(вид, локальные_переменные, буфер=nil, &блок) Показать исходный код
# File actionview/lib/action_view/template.rb, line 156
def render(view, locals, buffer=nil, &block)
  instrument("!render_template".freeze) do
    compile!(view)
    view.send(method_name, locals, buffer, &block)
  end
rescue => e
  handle_render_error(view, e)
end

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

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

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

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

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

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

инструментировать(действие, &блок) Показать исходный код
# File actionview/lib/action_view/template.rb, line 350
def instrument(action, &block)
  payload = { virtual_path: @virtual_path, identifier: @identifier }
  case action
  when "!render_template".freeze
    ActiveSupport::Notifications.instrument("!render_template.action_view".freeze, payload, &block)
  else
    ActiveSupport::Notifications.instrument("#{action}.action_view".freeze, payload, &block)
  end
end

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

Spec-Zone.ru

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