Spec-Zone.ru › Ruby on Rails 4.1

class ActionView::Template

Parent:
Объект

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

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

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

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

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

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

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

# 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
render(view, locals, buffer=nil, &block) Показать исходный код

Отобразить шаблон. Если шаблон еще не был скомпилирован, это делается непосредственно перед отображением.

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

# 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
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 337
def instrument(action, &block)
  payload = { virtual_path: @virtual_path, identifier: @identifier }
  ActiveSupport::Notifications.instrument("#{action}.action_view", payload, &block)
end

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

Spec-Zone.ru

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