класс ERB
Атрибуты
Кодировка для выполнения.
Необязательный аргумент filename, передаваемый в Kernel#eval при выполнении кода ERB.
Необязательный аргумент lineno, передаваемый в Kernel#eval при выполнении кода ERB.
Код Ruby, сгенерированный ERB.
Публичные методы класса
# File lib/erb.rb, line 827 def initialize(str, safe_level=nil, trim_mode=nil, eoutvar='_erbout') @safe_level = safe_level compiler = make_compiler(trim_mode) set_eoutvar(compiler, eoutvar) @src, @encoding, @frozen_string = *compiler.compile(str) @filename = nil @lineno = 0 end
Создаёт новый объект ERB с шаблоном, указанным в str.
Объект ERB работает путём построения фрагмента кода Ruby, который выведет готовый шаблон при выполнении. Если safe_level задан ненулевым значением, код ERB будет выполняться в отдельном потоке с $SAFE, установленным на указанный уровень.
Если в trim_mode передано строковое значение, содержащее один или несколько из следующих модификаторов, ERB скорректирует генерацию кода, как указано:
% enables Ruby code processing for lines beginning with % <> omit newline for lines starting with <% and ending in %> > omit newline for lines ending in %> - omit blank lines ending in -%>
eoutvar можно использовать для задания имени переменной, в которой ERB будет накапливать свой вывод. Это полезно, когда необходимо выполнить несколько шаблонов ERB через одно и то же связывание и/или когда нужно контролировать, куда попадает вывод. Передайте имя переменной внутри строки.
Пример
require "erb"
# build data class
class Listings
PRODUCT = { :name => "Chicken Fried Steak",
:desc => "A well messages pattie, breaded and fried.",
:cost => 9.95 }
attr_reader :product, :price
def initialize( product = "", price = "" )
@product = product
@price = price
end
def build
b = binding
# create and run templates, filling member data variables
ERB.new(" <%= PRODUCT[:name] %>
<%= PRODUCT[:desc] %>
".gsub(/^\s+/, ""), 0, "", "@product").result b
ERB.new(" <%= PRODUCT[:name] %> -- <%= PRODUCT[:cost] %>
<%= PRODUCT[:desc] %>
".gsub(/^\s+/, ""), 0, "", "@price").result b
end
end
# setup template data
listings = Listings.new
listings.build
puts listings.product + "\n" + listings.price
Генерирует
Chicken Fried Steak A well messages pattie, breaded and fried. Chicken Fried Steak -- 9.95 A well messages pattie, breaded and fried.
# File lib/erb.rb, line 263
def self.version
"erb.rb [2.1.0 #{ERB::Revision.split[1]}]"
end Возвращает информацию о ревизии модуля erb.rb.
Публичные методы экземпляра
# File lib/erb.rb, line 950 def def_class(superklass=Object, methodname='result') cls = Class.new(superklass) def_method(cls, methodname, @filename || '(ERB)') cls end
Определяет безымянный класс, у которого methodname является методом экземпляра, и возвращает его.
пример:
class MyClass_
def initialize(arg1, arg2)
@arg1 = arg1; @arg2 = arg2
end
end
filename = 'example.rhtml' # @arg1 and @arg2 are used in example.rhtml
erb = ERB.new(File.read(filename))
erb.filename = filename
MyClass = erb.def_class(MyClass_, 'render()')
print MyClass.new('foo', 123).render()
# File lib/erb.rb, line 914
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 Определяет methodname как метод экземпляра mod из скомпилированного кода Ruby.
пример:
filename = 'example.rhtml' # 'arg1' and 'arg2' are used in example.rhtml
erb = ERB.new(File.read(filename))
erb.def_method(MyClass, 'render(arg1, arg2)', filename)
print MyClass.new.render('foo', 123)
# File lib/erb.rb, line 931 def def_module(methodname='erb') mod = Module.new def_method(mod, methodname, @filename || '(ERB)') mod end
Создаёт безымянный модуль, определяет methodname как метод экземпляра этого модуля и возвращает его.
пример:
filename = 'example.rhtml' # 'arg1' and 'arg2' are used in example.rhtml
erb = ERB.new(File.read(filename))
erb.filename = filename
MyModule = erb.def_module('render(arg1, arg2)')
class MyClass
include MyModule
end
# File lib/erb.rb, line 857 def location=((filename, lineno)) @filename = filename @lineno = lineno if lineno end
# File lib/erb.rb, line 839 def make_compiler(trim_mode) ERB::Compiler.new(trim_mode) end
Создаёт новый компилятор для ERB. Подробности см. в ERB::Compiler.new
# File lib/erb.rb, line 887
def result(b=new_toplevel)
if @safe_level
proc {
$SAFE = @safe_level
eval(@src, b, (@filename || '(erb)'), @lineno)
}.call
else
eval(@src, b, (@filename || '(erb)'), @lineno)
end
end Выполняет сгенерированный код ERB для получения завершённого шаблона, возвращая результаты этого кода. (Подробности о том, как этот процесс может быть изменён параметром safe_level, см. в ::new).
b принимает объект Binding, который используется для установки контекста оценки кода.
# File lib/erb.rb, line 875 def run(b=new_toplevel) print self.result(b) end
Генерирует результаты и выводит их. (см. #result)
# File lib/erb.rb, line 867
def set_eoutvar(compiler, eoutvar = '_erbout')
compiler.put_cmd = "#{eoutvar}.concat"
compiler.insert_cmd = "#{eoutvar}.concat"
compiler.pre_cmd = ["#{eoutvar} = String.new"]
compiler.post_cmd = ["#{eoutvar}.force_encoding(__ENCODING__)"]
end Можно использовать для задания eoutvar, как описано в ::new. Вероятно, проще использовать конструктор, так как для вызова этого метода требуется настройка объекта компилятора ERB.
Приватные методы экземпляра
# File lib/erb.rb, line 902 def new_toplevel TOPLEVEL_BINDING.dup end
Возвращает новую область связывания каждый раз, близкую к TOPLEVEL_BINDING для запусков, не указывающих область связывания.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.