класс ERB
Атрибуты
Кодировка для вычисления.
Дополнительный аргумент filename, передаваемый методу Kernel#eval, когда выполняется код ERB.
Дополнительный аргумент lineno, передаваемый методу Kernel#eval, когда выполняется код ERB.
Код Ruby, сгенерированный ERB.
Открытые методы класса
# File lib/erb.rb, line 795 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 = *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 919 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 882
def def_method(mod, methodname, fname='(ERB)')
src = self.src
magic_comment = "#coding:#{@encoding}\n"
mod.module_eval do
eval(magic_comment + "def #{methodname}\n" + src + "\nend\n", binding, fname, -2)
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 900 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 825 def location=((filename, lineno)) @filename = filename @lineno = lineno if lineno end
# File lib/erb.rb, line 807 def make_compiler(trim_mode) ERB::Compiler.new(trim_mode) end
Создаёт новый компилятор для ERB. Подробнее см. ERB::Compiler.new
# File lib/erb.rb, line 855
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 843 def run(b=new_toplevel) print self.result(b) end
Генерирует результаты и выводит их. (см. #result)
# File lib/erb.rb, line 835
def set_eoutvar(compiler, eoutvar = '_erbout')
compiler.put_cmd = "#{eoutvar}.concat"
compiler.insert_cmd = "#{eoutvar}.concat"
compiler.pre_cmd = ["#{eoutvar} = ''"]
compiler.post_cmd = ["#{eoutvar}.force_encoding(__ENCODING__)"]
end Можно использовать для установки eoutvar, как описано в ::new. Однако, вероятно, проще использовать конструктор, так как вызов этого метода требует настройки объекта компилятора ERB.
Закрытые методы экземпляра
# File lib/erb.rb, line 870 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.