Spec-Zone.ru › Ruby on Rails 4.2

класс ActionView::Template

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

Action View Шаблон

Action View Шаблон

Action View HTML Шаблон

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

Константы

Finalizer

Этот финализатор необходим (и именно с проком внутри другого прока), иначе шаблоны утекут в разработке.

Атрибуты

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

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

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

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

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

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

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

Spec-Zone.ru

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