Spec-Zone.ru › Ruby 4.0

класс ERB

Родительский класс:
Object

Класс 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."

Подробности:

  1. Переменной template присваивается строка обычного текста. Встроенный в неё тег-выражение '<%= Time.now %>' содержит выражение Ruby — Time.now.

  2. Строка помещается в новый объект ERB и сохраняется в переменной erb.

  3. Вызов метода 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."

Подробности:

  1. Как и прежде, переменной template присваивается строка обычного текста. Встроенный в неё тег-выражение '<%= magic_word %>' содержит имя переменной — magic_word.

  2. Строка помещается в новый объект ERB и сохраняется в переменной erb; обратите внимание, что magic_word необязательно определять до создания объекта ERB.

  3. magic_word = 'abracadabra' присваивает значение переменной magic_word.

  4. Вызов метода 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.

Атрибуты

encoding [R]

Возвращает кодировку self; см. раздел «Кодировки»:

filename [RW]

Задаёт или возвращает имя файла, используемое при сообщении об ошибках; см. раздел «Сообщения об ошибках».

lineno [RW]

Задаёт или возвращает номер строки, используемый при сообщении об ошибках; см. раздел «Сообщения об ошибках».

src [R]

Возвращает код 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

Общедоступные методы класса

new(template, trim_mode: nil, eoutvar: '_erbout') Показать исходный код
# 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 с одной привязкой и/или управлять тем, куда попадают выходные данные.

Рекомендуется выбирать имя переменной, начинающееся с подчёркивания: '_'.

version → string Показать исходный код
# File lib/erb.rb, line 786
def self.version
  VERSION
end

Возвращает строку с версией ERB.

Общедоступные методы экземпляра

def_class(super_class = Object, method_name = 'result') → new_class Показать исходный код
# 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>
def_method(module, method_signature, filename = '(ERB)') → method_name Показать исходный код
# 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"
def_module(method_name = 'erb') → new_module Показать исходный код
# 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"
location = [filename, lineno] → [filename, lineno] Показать исходный код
location = filename → filename
# File lib/erb.rb, line 936
def location=((filename, lineno))
  @filename = filename
  @lineno = lineno if lineno
end

Задаёт значения filename и, если оно указано, lineno; см. раздел «Сообщения об ошибках».

make_compiler → erb_compiler Показать исходный код
# 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>
result(binding = new_toplevel) → new_string Показать исходный код
# 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.

result_with_hash(hash) → new_string Показать исходный код
# 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.

run(binding = new_toplevel) → nil Показать исходный код
# File lib/erb.rb, line 985
def run(b=new_toplevel)
  print self.result(b)
end

Подобно result, но выводит строку результата (вместо её возврата); возвращает nil.

set_eoutvar(compiler, eoutvar = '_erbout') → [eoutvar] Показать исходный код
# 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>

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

new_toplevel(symbols) → new_binding Показать исходный код
# 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.

Spec-Zone.ru

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