класс ERB
Класс ERB (название расшифровывается как Embedded Ruby) — это простой в использовании, но при этом очень мощный обработчик шаблонов.
Использование
Прежде чем использовать ERB, необходимо подключить его (предполагается, что это уже сделано в примерах на этой странице):
require 'erb'
Кратко
Принцип работы ERB:
-
Можно создать шаблон — строку обычного текста, содержащую специально отформатированные теги.
-
Можно создать объект ERB для хранения шаблона.
-
Можно вызвать метод экземпляра
ERB#result, чтобы получить результат.
ERB поддерживает три вида тегов:
-
Теги-выражения: начинаются с
'<%='и заканчиваются'%>'; содержат выражение Ruby; в результате всё содержимое тега заменяется значением выражения:template = 'The magic word is <%= magic_word %>.' erb = ERB.new(template) magic_word = 'xyzzy' erb.result(binding) # => "The magic word is xyzzy."
В приведённый выше вызов
resultпередаётся аргументbinding, содержащий привязку переменнойmagic_wordк её строковому значению'xyzzy'.В приведённый ниже вызов
resultне нужно передавать привязку, поскольку выражениеDate::DAYNAMESопределено глобально.ERB.new('Today is <%= Date::DAYNAMES[Date.today.wday] %>.').result # => "Today is Monday." -
Теги выполнения: начинаются с
'<%'и заканчиваются'%>'; содержат код Ruby для выполнения:template = '<% File.write("t.txt", "Some stuff.") %>' ERB.new(template).result File.read('t.txt') # => "Some stuff." -
Теги-комментарии: начинаются с
'<%#'и заканчиваются'%>'; содержат текст комментария; в результате весь тег пропускается.template = 'Some stuff;<%# Note to self: figure out what the stuff is. %> more stuff.' ERB.new(template).result # => "Some stuff; more stuff."
Несколько простых примеров
Простой пример использования ERB:
template = 'The time is <%= Time.now %>.' erb = ERB.new(template) erb.result # => "The time is 2025-09-09 10:49:26 -0500."
Подробности:
-
Переменной
templateприсваивается строка обычного текста. Встроенный в неё тег-выражение'<%= Time.now %>'содержит выражение Ruby —Time.now. -
Строка помещается в новый объект ERB и сохраняется в переменной
erb. -
Вызов метода
erb.resultсоздаёт строку, содержащую значениеTime.nowво время выполнения, вычисленное в момент вызова.
Объект ERB можно использовать повторно:
erb.result # => "The time is 2025-09-09 10:49:33 -0500."
Ещё один пример:
template = 'The magic word is <%= magic_word %>.' erb = ERB.new(template) magic_word = 'abracadabra' erb.result(binding) # => "The magic word is abracadabra."
Подробности:
-
Как и прежде, переменной
templateприсваивается строка обычного текста. Встроенный в неё тег-выражение'<%= magic_word %>'содержит имя переменной —magic_word. -
Строка помещается в новый объект ERB и сохраняется в переменной
erb; обратите внимание, чтоmagic_wordнеобязательно определять до создания объекта ERB. -
magic_word = 'abracadabra'присваивает значение переменнойmagic_word. -
Вызов метода
erb.result(binding)создаёт строку, содержащую значениеmagic_word.
Как и прежде, объект ERB можно использовать повторно:
magic_word = 'xyzzy' erb.result(binding) # => "The magic word is xyzzy."
Привязки
Вызову метода result, который формирует строку форматированного результата, требуется объект Binding в качестве аргумента.
Объект привязки предоставляет привязки для выражений в тегах-выражениях.
Есть три способа передать требуемую привязку:
Привязка Binding
Если методу result не передан аргумент binding, он использует привязку по умолчанию — ту, которую возвращает метод new_toplevel. Эта привязка содержит привязки, определённые самим Ruby, то есть привязки констант и переменных Ruby.
Этой привязки достаточно для тега-выражения, который обращается только к константам и переменным Ruby; в этих тегах-выражениях используются только глобальная константа Ruby RUBY_COPYRIGHT и глобальная переменная $0:
template = <<TEMPLATE The Ruby copyright is <%= RUBY_COPYRIGHT.inspect %>. The current process is <%= $0 %>. TEMPLATE puts ERB.new(template).result The Ruby copyright is "ruby - Copyright (C) 1993-2025 Yukihiro Matsumoto". The current process is irb.
(Текущий процесс — irb, поскольку именно в нём мы выполняем эти примеры!)
Локальная Binding
Привязки по умолчанию недостаточно для выражения, которое обращается к константе или переменной, не определённой в ней:
Foo = 1 # Defines local constant Foo. foo = 2 # Defines local variable foo. template = <<TEMPLATE The current value of constant Foo is <%= Foo %>. The current value of variable foo is <%= foo %>. The Ruby copyright is <%= RUBY_COPYRIGHT.inspect %>. The current process is <%= $0 %>. TEMPLATE erb = ERB.new(template)
Приведённый ниже вызов вызывает исключение NameError, поскольку, хотя Foo и foo определены локально, они не определены в привязке по умолчанию:
erb.result # Raises NameError.
Чтобы сделать локально определённые константы и переменные доступными, можно вызвать result с локальной привязкой:
puts erb.result(binding) The current value of constant Foo is 1. The current value of variable foo is 2. The Ruby copyright is "ruby - Copyright (C) 1993-2025 Yukihiro Matsumoto". The current process is irb.
Расширенная Binding
Ещё один способ сделать доступными привязки переменных (но не привязки констант) — использовать метод result_with_hash(hash); передаваемый хеш содержит пары «имя/значение», которые используются для определения и присваивания переменных в копии привязки по умолчанию:
template = <<TEMPLATE The current value of variable bar is <%= bar %>. The current value of variable baz is <%= baz %>. The Ruby copyright is <%= RUBY_COPYRIGHT.inspect %>. The current process is <%= $0 %>. TEMPLATE erb = ERB.new(template)
Оба этих вызова вызывают исключение NameError, поскольку bar и baz не определены ни в привязке по умолчанию, ни в локальной привязке.
puts erb.result # Raises NameError. puts erb.result(binding) # Raises NameError.
Этот вызов передаёт хеш, который позволяет определить bar и baz в новой привязке (созданной на основе new_toplevel):
hash = {bar: 3, baz: 4}
puts erb.result_with_hash(hash)
The current value of variable bar is 3.
The current value of variable baz is 4.
The Ruby copyright is "ruby - Copyright (C) 1993-2025 Yukihiro Matsumoto".
The current process is irb. Теги
В примерах выше используются теги-выражения. В ERB доступны следующие теги:
-
Тег-выражение: содержит выражение Ruby; в результате весь тег заменяется значением выражения во время выполнения.
-
Тег выполнения: содержит код Ruby; в результате весь тег заменяется значением кода во время выполнения.
-
Тег-комментарий: содержит код комментария; в результате весь тег пропускается.
Теги-выражения
В шаблон можно встроить выражение Ruby с помощью тега-выражения.
Его синтаксис: <%= expression %>, где expression — любое допустимое выражение Ruby.
При вызове метода result метод вычисляет выражение и заменяет весь тег-выражение значением выражения:
ERB.new('Today is <%= Date::DAYNAMES[Date.today.wday] %>.').result
# => "Today is Monday."
ERB.new('Tomorrow will be <%= Date::DAYNAMES[Date.today.wday + 1] %>.').result
# => "Tomorrow will be Tuesday."
ERB.new('Yesterday was <%= Date::DAYNAMES[Date.today.wday - 1] %>.').result
# => "Yesterday was Sunday."
Обратите внимание, что пробелы перед выражением и после него допускаются, но не обязательны; такие пробелы удаляются из результата.
ERB.new('My appointment is on <%=Date::DAYNAMES[Date.today.wday + 2]%>.').result
# => "My appointment is on Wednesday."
ERB.new('My appointment is on <%= Date::DAYNAMES[Date.today.wday + 2] %>.').result
# => "My appointment is on Wednesday."
Теги выполнения
В шаблон можно встроить исполняемый код Ruby с помощью тега выполнения.
Его синтаксис: <% code %>, где code — любой допустимый код Ruby.
При вызове метода result метод выполняет код и удаляет весь тег выполнения (в результате не создаётся текст):
ERB.new('foo <% Dir.chdir("C:/") %> bar').result # => "foo bar"
Пробелы перед встроенным кодом и после него необязательны:
ERB.new('foo <%Dir.chdir("C:/")%> bar').result # => "foo bar"
Теги выполнения можно чередовать с текстом, чтобы сформировать управляющую конструкцию, например условие, цикл или инструкции case.
Условие:
template = <<TEMPLATE <% if verbosity %> An error has occurred. <% else %> Oops! <% end %> TEMPLATE erb = ERB.new(template) verbosity = true erb.result(binding) # => "\nAn error has occurred.\n\n" verbosity = false erb.result(binding) # => "\nOops!\n\n"
Обратите внимание, что чередующийся текст сам может содержать теги-выражения:
Цикл:
template = <<TEMPLATE <% Date::ABBR_DAYNAMES.each do |dayname| %> <%= dayname %> <% end %> TEMPLATE ERB.new(template).result # => "\nSun\n\nMon\n\nTue\n\nWed\n\nThu\n\nFri\n\nSat\n\n"
С текстом можно чередовать и другие строки кода Ruby, не являющиеся управляющими конструкциями; сам код Ruby может содержать обычные комментарии Ruby:
template = <<TEMPLATE <% 3.times do %> <%= Time.now %> <% sleep(1) # Let's make the times different. %> <% end %> TEMPLATE ERB.new(template).result # => "\n2025-09-09 11:36:02 -0500\n\n\n2025-09-09 11:36:03 -0500\n\n\n2025-09-09 11:36:04 -0500\n\n\n"
Тег выполнения также может содержать несколько строк кода:
template = <<TEMPLATE
<%
(0..2).each do |i|
(0..2).each do |j|
%>
* <%=i%>,<%=j%>
<%
end
end
%>
TEMPLATE
ERB.new(template).result
# => "\n* 0,0\n\n* 0,1\n\n* 0,2\n\n* 1,0\n\n* 1,1\n\n* 1,2\n\n* 2,0\n\n* 2,1\n\n* 2,2\n\n"
Сокращённый формат тегов выполнения
Чтобы включить сокращённый формат тегов выполнения, можно использовать именованный аргумент trim_mode: '%'; в этом примере используется сокращённый формат % code вместо <% code %>:
template = <<TEMPLATE
% priorities.each do |priority|
* <%= priority %>
% end
TEMPLATE
erb = ERB.new(template, trim_mode: '%')
priorities = [ 'Run Ruby Quiz',
'Document Modules',
'Answer Questions on Ruby Talk' ]
puts erb.result(binding)
* Run Ruby Quiz
* Document Modules
* Answer Questions on Ruby Talk Обратите внимание: в сокращённом формате символ '%' должен быть первым символом в строке кода (без пробелов в начале).
Удаление ненужных пустых строк
Если именованный аргумент trim_mode не указан, все пустые строки попадают в результат:
template = <<TEMPLATE
<% if true %>
<%= RUBY_VERSION %>
<% end %>
TEMPLATE
ERB.new(template).result.lines.each {|line| puts line.inspect }
"\n"
"3.4.5\n"
"\n"
Можно указать trim_mode: '-' и удалить каждую пустую строку, исходная строка которой заканчивается на -%> (вместо %>):
template = <<TEMPLATE
<% if true -%>
<%= RUBY_VERSION %>
<% end -%>
TEMPLATE
ERB.new(template, trim_mode: '-').result.lines.each {|line| puts line.inspect }
"3.4.5\n"
Использовать завершающую запись '-%>' без trim_mode: '-' нельзя:
ERB.new(template).result.lines.each {|line| puts line.inspect } # Raises SyntaxError.
Удаление ненужных символов новой строки
Рассмотрим этот шаблон:
template = <<TEMPLATE <% RUBY_VERSION %> <%= RUBY_VERSION %> foo <% RUBY_VERSION %> foo <%= RUBY_VERSION %> TEMPLATE
Если именованный аргумент trim_mode не указан, все символы новой строки попадают в результат:
ERB.new(template).result.lines.each {|line| puts line.inspect }
"\n"
"3.4.5\n"
"foo \n"
"foo 3.4.5\n"
Можно указать trim_mode: '>', чтобы удалять завершающий символ новой строки в каждой строке, заканчивающейся на '%>' (независимо от её начала):
ERB.new(template, trim_mode: '>').result.lines.each {|line| puts line.inspect }
"3.4.5foo foo 3.4.5"
Можно указать trim_mode: '<>', чтобы удалять завершающий символ новой строки в каждой строке, которая начинается с '<%' и заканчивается на '%>':
ERB.new(template, trim_mode: '<>').result.lines.each {|line| puts line.inspect }
"3.4.5foo \n"
"foo 3.4.5\n"
Сочетание режимов удаления
Можно сочетать некоторые режимы удаления:
-
'%-': включает сокращённый формат и удаляет каждую пустую строку, заканчивающуюся на'-%>'. -
'%>': включает сокращённый формат и удаляет символ новой строки в каждой строке, заканчивающейся на'%>'. -
'%<>': включает сокращённый формат и удаляет символ новой строки в каждой строке, начинающейся с'<%'и заканчивающейся на'%>'.
Теги-комментарии
В шаблон можно встроить комментарий с помощью тега-комментария; его синтаксис: <%# text %>, где text — текст комментария.
При вызове метода result весь тег-комментарий удаляется (в результате не создаётся текст).
Пример:
template = 'Some stuff;<%# Note to self: figure out what the stuff is. %> more stuff.' ERB.new(template).result # => "Some stuff; more stuff."
Тег-комментарий может располагаться в любом месте шаблона.
Обратите внимание, что начало тега должно иметь вид '<%#', а не '<% #'.
В этом примере тег начинается с '<% #', поэтому это тег выполнения, а не тег-комментарий; указанный код целиком состоит из комментария в стиле Ruby (который, разумеется, игнорируется):
ERB.new('Some stuff;<% # Note to self: figure out what the stuff is. %> more stuff.').result
# => "Some stuff;"
Кодировки
У объекта ERB есть кодировка, по умолчанию совпадающая с кодировкой строки шаблона; строка результата также будет иметь эту кодировку.
template = <<TEMPLATE <%# Comment. %> TEMPLATE erb = ERB.new(template) template.encoding # => #<Encoding:UTF-8> erb.encoding # => #<Encoding:UTF-8> erb.result.encoding # => #<Encoding:UTF-8>
Можно указать другую кодировку, добавив в начало шаблона магический комментарий:
template = <<TEMPLATE <%#-*- coding: Big5 -*-%> <%# Comment. %> TEMPLATE erb = ERB.new(template) template.encoding # => #<Encoding:UTF-8> erb.encoding # => #<Encoding:Big5> erb.result.encoding # => #<Encoding:Big5>
Сообщения об ошибках
Рассмотрим этот шаблон (содержащий ошибку):
template = '<%= nosuch %>' erb = ERB.new(template)
При сообщении об ошибке ERB указывает имя файла (если оно доступно) и номер строки; имя файла берётся из метода filename, а номер строки — из метода lineno.
Изначально эти значения равны nil и 0 соответственно; при сообщении об ошибке они указываются как '(erb)' и 1 соответственно:
erb.filename # => nil erb.lineno # => 0 erb.result (erb):1:in '<main>': undefined local variable or method 'nosuch' for main (NameError)
Методы filename= и lineno= позволяют присвоить значения, более подходящие для вашего контекста:
erb.filename = 't.txt' erb.lineno = 555 erb.result t.txt:556:in '<main>': undefined local variable or method 'nosuch' for main (NameError)
Метод location= позволяет задать оба значения:
erb.location = ['u.txt', 999] erb.result u.txt:1000:in '<main>': undefined local variable or method 'nosuch' for main (NameError)
Обычный текст со встроенным Ruby
Ниже приведён шаблон обычного текста; для его определения используется запись литерала '%q{ ... }' (см. литералы %q), которая позволяет избежать проблем с обратными косыми чертами.
template = %q{
From: James Edward Gray II <james@grayproductions.net>
To: <%= to %>
Subject: Addressing Needs
<%= to[/\w+/] %>:
Just wanted to send a quick note assuring that your needs are being
addressed.
I want you to know that my team will keep working on the issues,
especially:
<%# ignore numerous minor requests -- focus on priorities %>
% priorities.each do |priority|
* <%= priority %>
% end
Thanks for your patience.
James Edward Gray II
}
Для шаблона понадобятся следующие данные:
to = 'Community Spokesman <spokesman@ruby_community.org>'
priorities = [ 'Run Ruby Quiz',
'Document Modules',
'Answer Questions on Ruby Talk' ]
Наконец, создайте объект ERB и получите результат
erb = ERB.new(template, trim_mode: '%<>') puts erb.result(binding) From: James Edward Gray II <james@grayproductions.net> To: Community Spokesman <spokesman@ruby_community.org> Subject: Addressing Needs Community: Just wanted to send a quick note assuring that your needs are being addressed. I want you to know that my team will keep working on the issues, especially: * Run Ruby Quiz * Document Modules * Answer Questions on Ruby Talk Thanks for your patience. James Edward Gray II
HTML со встроенным Ruby
В этом примере показан шаблон HTML.
Сначала рассмотрим пользовательский класс Product:
class Product
def initialize(code, name, desc, cost)
@code = code
@name = name
@desc = desc
@cost = cost
@features = []
end
def add_feature(feature)
@features << feature
end
# Support templating of member data.
def get_binding
binding
end
end
Для приведённого ниже шаблона понадобятся следующие значения:
toy = Product.new('TZ-1002',
'Rubysapien',
"Geek's Best Friend! Responds to Ruby commands...",
999.95
)
toy.add_feature('Listens for verbal commands in the Ruby language!')
toy.add_feature('Ignores Perl, Java, and all C variants.')
toy.add_feature('Karate-Chop Action!!!')
toy.add_feature('Matz signature on left leg.')
toy.add_feature('Gem studded eyes... Rubies, of course!')
Вот HTML:
template = <<TEMPLATE
<html>
<head><title>Ruby Toys -- <%= @name %></title></head>
<body>
<h1><%= @name %> (<%= @code %>)</h1>
<p><%= @desc %></p>
<ul>
<% @features.each do |f| %>
<li><b><%= f %></b></li>
<% end %>
</ul>
<p>
<% if @cost < 10 %>
<b>Only <%= @cost %>!!!</b>
<% else %>
Call for a price, today!
<% end %>
</p>
</body>
</html>
TEMPLATE
Наконец, создайте объект ERB и получите результат (удалив некоторые пустые строки):
erb = ERB.new(template)
puts erb.result(toy.get_binding)
<html>
<head><title>Ruby Toys -- Rubysapien</title></head>
<body>
<h1>Rubysapien (TZ-1002)</h1>
<p>Geek's Best Friend! Responds to Ruby commands...</p>
<ul>
<li><b>Listens for verbal commands in the Ruby language!</b></li>
<li><b>Ignores Perl, Java, and all C variants.</b></li>
<li><b>Karate-Chop Action!!!</b></li>
<li><b>Matz signature on left leg.</b></li>
<li><b>Gem studded eyes... Rubies, of course!</b></li>
</ul>
<p>
Call for a price, today!
</p>
</body>
</html> Другие обработчики шаблонов
В различных проектах Ruby есть собственные обработчики шаблонов. Например, в системе обработки Ruby RDoc есть обработчик, который можно использовать и в других проектах.
Другие популярные обработчики шаблонов можно найти на странице Template Engines сайта Ruby Toolbox.
Константы
- VERSION
-
Строка с версией ERB.
Атрибуты
Возвращает кодировку self; см. раздел «Кодировки»:
Задаёт или возвращает имя файла, используемое при сообщении об ошибках; см. раздел «Сообщения об ошибках».
Задаёт или возвращает номер строки, используемый при сообщении об ошибках; см. раздел «Сообщения об ошибках».
Возвращает код Ruby, выполнение которого формирует результат; этот код выполняется методом result и его обёрточными методами result_with_hash и run:
template = 'The time is <%= Time.now %>.' erb = ERB.new(template) erb.src # => "#coding:UTF-8\n_erbout = +''; _erbout.<< \"The time is \".freeze; _erbout.<<(( Time.now ).to_s); _erbout.<< \".\".freeze; _erbout" erb.result # => "The time is 2025-09-18 15:58:08 -0500."
В более удобном для чтения виде:
# puts erb.src.split('; ')
# #coding:UTF-8
# _erbout = +''
# _erbout.<< "The time is ".freeze
# _erbout.<<(( Time.now ).to_s)
# _erbout.<< ".".freeze
# _erbout
Переменная _erbout используется для хранения промежуточных результатов в коде; имя _erbout является значением по умолчанию в ERB.new и может быть изменено с помощью именованного аргумента eoutvar:
erb = ERB.new(template, eoutvar: '_foo')
puts template.src.split('; ')
#coding:UTF-8
_foo = +''
_foo.<< "The time is ".freeze
_foo.<<(( Time.now ).to_s)
_foo.<< ".".freeze
_foo
Общедоступные методы класса
# File lib/erb.rb, line 831 def initialize(str, trim_mode: nil, eoutvar: '_erbout') compiler = make_compiler(trim_mode) set_eoutvar(compiler, eoutvar) @src, @encoding, @frozen_string = *compiler.compile(str) @filename = nil @lineno = 0 @_init = self.class.singleton_class end
Возвращает новый объект ERB, содержащий заданную строку template.
Подробные сведения о template, встроенных тегах и формируемых результатах см. в разделе ERB.
Именованный аргумент trim_mode
Именованный аргумент trim_mode: '%' позволяет включить сокращённый формат тегов выполнения.
Это значение позволяет управлять пустыми строками:
-
'-': удаляет каждую пустую строку, заканчивающуюся на'%>'.
Другие значения позволяют управлять символами новой строки:
-
'>': удаляет символ новой строки в каждой строке, заканчивающейся на'%>'. -
'<>': удаляет символ новой строки в каждой строке, начинающейся с'<%'и заканчивающейся на'%>'.
Можно также сочетать режимы удаления.
Именованный аргумент eoutvar
Строковое значение именованного аргумента eoutvar задаёт имя переменной, которую метод result использует для формирования строки результата; см. src.
Это полезно, когда нужно обработать несколько шаблонов ERB с одной привязкой и/или управлять тем, куда попадают выходные данные.
Рекомендуется выбирать имя переменной, начинающееся с подчёркивания: '_'.
# File lib/erb.rb, line 786 def self.version VERSION end
Возвращает строку с версией ERB.
Общедоступные методы экземпляра
# File lib/erb.rb, line 1169 def def_class(superklass=Object, methodname='result') cls = Class.new(superklass) def_method(cls, methodname, @filename || '(ERB)') cls end
Возвращает новый класс без имени, суперклассом которого является super_class и который имеет метод экземпляра method_name.
Создайте шаблон из HTML со встроенными тегами-выражениями, использующими @arg1 и @arg2:
html = <<TEMPLATE <html> <body> <p><%= @arg1 %></p> <p><%= @arg2 %></p> </body> </html> TEMPLATE template = ERB.new(html)
Создайте базовый класс, содержащий @arg1 и @arg2:
class MyBaseClass
def initialize(arg1, arg2)
@arg1 = arg1
@arg2 = arg2
end
end
Используйте метод def_class, чтобы создать подкласс с методом :render:
MySubClass = template.def_class(MyBaseClass, :render)
Сформируйте результат:
puts MySubClass.new('foo', 123).render
<html>
<body>
<p>foo</p>
<p>123</p>
</body>
</html> # File lib/erb.rb, line 1087
def def_method(mod, methodname, fname='(ERB)')
src = self.src.sub(/^(?!#|$)/) {"def #{methodname}\n"} << "\nend\n"
mod.module_eval do
eval(src, binding, fname, -1)
end
end Создаёт и возвращает новый метод экземпляра в заданном модуле module; имя метода возвращается в виде символа.
Метод создаётся на основе заданной method_signature, состоящей из имени метода и имён его аргументов (если они есть).
Параметр filename задаёт значение filename; см. раздел «Сообщения об ошибках».
template = '<%= arg1 %> <%= arg2 %>'
erb = ERB.new(template)
MyModule = Module.new
erb.def_method(MyModule, 'render(arg1, arg2)') # => :render
class MyClass; include MyModule; end
MyClass.new.render('foo', 123) # => "foo 123"
# File lib/erb.rb, line 1112 def def_module(methodname='erb') mod = Module.new def_method(mod, methodname, @filename || '(ERB)') mod end
Возвращает новый модуль без имени, содержащий метод экземпляра method_name.
template = '<%= arg1 %> <%= arg2 %>'
erb = ERB.new(template)
MyModule = template.def_module('render(arg1, arg2)')
class MyClass
include MyModule
end
MyClass.new.render('foo', 123)
# => "foo 123"
# File lib/erb.rb, line 936 def location=((filename, lineno)) @filename = filename @lineno = lineno if lineno end
Задаёт значения filename и, если оно указано, lineno; см. раздел «Сообщения об ошибках».
# File lib/erb.rb, line 853 def make_compiler(trim_mode) ERB::Compiler.new(trim_mode) end
Возвращает новый ERB::Compiler с заданным trim_mode; допустимые значения trim_mode см. в описании ERB.new:
ERB.new('').make_compiler(nil)
# => #<ERB::Compiler:0x000001cff9467678 @insert_cmd="print", @percent=false, @post_cmd=[], @pre_cmd=[], @put_cmd="print", @trim_mode=nil>
# File lib/erb.rb, line 1007
def result(b=new_toplevel)
unless @_init.equal?(self.class.singleton_class)
raise ArgumentError, "not initialized"
end
eval(@src, b, (@filename || '(erb)'), @lineno)
end Возвращает строку результата, сформированную при обработке тегов ERB, найденных в сохранённом шаблоне в self.
Если аргумент не указан, используется привязка по умолчанию; см. раздел «Привязка по умолчанию».
Если указан аргумент binding, используется локальная привязка; см. раздел «Локальная привязка».
См. также result_with_hash.
# File lib/erb.rb, line 1026
def result_with_hash(hash)
b = new_toplevel(hash.keys)
hash.each_pair do |key, value|
b.local_variable_set(key, value)
end
result(b)
end Возвращает строку результата, сформированную при обработке тегов ERB, найденных в сохранённой строке в self; см. раздел «Расширенная привязка».
См. также result.
# File lib/erb.rb, line 985 def run(b=new_toplevel) print self.result(b) end
Подобно result, но выводит строку результата (вместо её возврата); возвращает nil.
# File lib/erb.rb, line 971
def set_eoutvar(compiler, eoutvar = '_erbout')
compiler.put_cmd = "#{eoutvar}.<<"
compiler.insert_cmd = "#{eoutvar}.<<"
compiler.pre_cmd = ["#{eoutvar} = +''"]
compiler.post_cmd = [eoutvar]
end Задаёт значение eoutvar в объекте ERB::Compiler compiler; возвращает массив из одного элемента со значением eoutvar:
template = ERB.new('')
compiler = template.make_compiler(nil)
pp compiler
#<ERB::Compiler:0x000001cff8a9aa00
@insert_cmd="print",
@percent=false,
@post_cmd=[],
@pre_cmd=[],
@put_cmd="print",
@trim_mode=nil>
template.set_eoutvar(compiler, '_foo') # => ["_foo"]
pp compiler
#<ERB::Compiler:0x000001cff8a9aa00
@insert_cmd="_foo.<<",
@percent=false,
@post_cmd=["_foo"],
@pre_cmd=["_foo = +''"],
@put_cmd="_foo.<<",
@trim_mode=nil> Закрытые методы экземпляра
# File lib/erb.rb, line 1050
def new_toplevel(vars = nil)
b = TOPLEVEL_BINDING
if vars
vars = vars.select {|v| b.local_variable_defined?(v)}
unless vars.empty?
return b.eval("tap {|;#{vars.join(',')}| break binding}")
end
end
b.dup
end Возвращает новую привязку на основе TOPLEVEL_BINDING; используется для создания привязки по умолчанию при вызове result.
См. раздел «Привязка по умолчанию».
Аргумент symbols — это массив символов; каждый символ symbol определяется как новая переменная, чтобы скрыть её и не допустить перезаписи одноимённой переменной, уже определённой в привязке.
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.