Как я могу использовать yield для наследования шаблонов в erb? Я хочу использовать erb в обычном Ruby CGI script и хочу использовать базовый шаблон и подтемы, как это делает Rails с шаблоном приложения.
Выход в ERB без рельсов
Ответ 1
Я не думаю, что вы можете - Rails предоставляет эту инфраструктуру как часть actionpack.
Что вы можете сделать, это взять actionpack и добавить его в свой script.
В качестве альтернативы вы можете самостоятельно намотать легкую систему шаблонов.
Альтернативно альтернативно используйте Rails или Merb или Sinatra.
Ответ 2
def a
ERB.new('<%= yield %>').result(binding)
end
a{123}
#=> "123"
Важно, чтобы вызов Kernel#binding
находился внутри метода, таким образом контекст включает в себя блок (ERB#result
не будет принимать блок).
Ответ 3
Отметьте Tilt (http://github.com/rtomayko/tilt/). Это драгоценный камень, который обрабатывает шаблоны в Sinatra, и он обеспечивает доходность ERB наряду со многими другими приятными функциями.
Ответ 4
Вы можете использовать Tilt, но если вы не хотите добавлять дополнительную зависимость, вот лучший пример того, как вы можете уступить в erb:
require "erb"
class Controller
TEMPLATE = ERB.new("Hello <%= @someone %>\n\n<%= yield %>")
def initialize(someone)
@someone = someone
end
def render
TEMPLATE.result(self.get_binding { yield })
end
def get_binding
binding
end
end
puts Controller.new("World").render { "I'm Jack" }
# =>
Hello World
I'm Jack
Я нашел ответ здесь.
Ответ 5
Я написал о добавлении этого в ERB стандартной библиотеки здесь http://hostiledeveloper.com/2015/05/28/working-with-templates-in-ruby-erb.html
Это удивительно боль в прикладе.