class ActionView::Template
Action View Шаблон
Action View Шаблон
Action View HTML Шаблон
Action View Текстовый Шаблон
Атрибуты
Открытые методы класса
# 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 Открытые методы экземпляра
# 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). Это будет работать с любым движком шаблонов, так как мы обрабатываем комментарий с кодировкой перед передачей источника в движок шаблонов, оставляя пустую строку вместо него.
# File actionview/lib/action_view/template.rb, line 186
def inspect
@inspect ||= defined?(Rails.root) ? identifier.sub("#{Rails.root}/", "".freeze) : identifier
end # 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"
# 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, передав объект представления.
Обратите внимание, что этот метод генерирует ошибку, если у шаблона, который нужно обновить, нет заданного виртуального пути (только для встроенных шаблонов).
# 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”. Обратите внимание, что мы используем восклицательный знак в этой инструментизации, потому что вам не нужно использовать это в продакшене. Это медлено только если на него подписываются.
# File actionview/lib/action_view/template.rb, line 144 def supports_streaming? handler.respond_to?(:supports_streaming?) && handler.supports_streaming? end
Возвращает, поддерживает ли базовый обработчик потоков. Если да, буфер потоков может быть передан при его начальном рендеринге.
# File actionview/lib/action_view/template.rb, line 163 def type @type ||= Types[@formats.first] if @formats.first end
Приватные методы экземпляра
# 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.